【问题标题】:Django : Direct assignment to the forward side of a many-to-many set is prohibited. Use user.set() insteadDjango:禁止直接分配到多对多集合的前端。改用 user.set()
【发布时间】:2019-02-18 06:52:09
【问题描述】:

当我尝试将当前登录的用户添加到另一个关系为ManyToManyField 时,我收到此错误。

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use user.set() instead.

这是我的代码:

Views.py

def add_to_cart(request , item):
    name = item
    size = request.POST.get("size")
    extras = request.POST.get("extras")
    c = Cart(item=name , size=size , extras=extras , user=request.user)
    c.save()
    return render(request , "orders/add_items.html" , {"message":f"{name} added to cart"})

Models.py

class Cart(models.Model):
    item = models.CharField(max_length=64)
    size = models.DecimalField(max_digits=5,decimal_places=2)
    extras = models.CharField(max_length=64 , null=True, blank=True)
    user = models.ManyToManyField(User , related_name="member")

def __str__(self):
    return f"{item} added by {user}"

【问题讨论】:

  • 不是从模型创建实例然后保存,而是执行以下操作,new_cart = Cart.objects.create(fieldname=value) new_cart.user.set()。 create 将允许您添加或设置 M2M 字段

标签: python django python-3.x


【解决方案1】:

您需要先保存购物车,然后才能将商品添加到多对多字段。

c = Cart(item=name , size=size , extras=extras)
c.save()
c.user.add(request.user)

您也可以在保存后使用set()。请注意,这将删除集合中未指定的任何相关用户(尽管在这种情况下它是一个新列表,因此没有任何)。

c.user.set([request.user]

最后,您确定要为此设置多对多字段吗?这允许购物车属于多个用户。如果是这种情况,我会将该字段命名为 users,而不是 user。如果每个购物车只需要一个user,那么我会使用ForeignKey。您的related_name members 也没有任何意义。这用于获取与用户相关的购物车,因此我希望您改用carts

【讨论】:

  • 调用add()set()后是否需要再次使用save()?还是自动为我们处理?
  • @ArtOfWarfare 不,您不必再次致电save()
猜你喜欢
  • 2019-03-02
  • 2021-07-01
  • 2018-10-05
  • 2020-03-21
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多