Джанго: прямое назначение передней стороне множества «многие ко многим» запрещено. Вместо этого используйте user.set () - PullRequest
0 голосов
/ 13 сентября 2018

Я получаю эту ошибку, когда пытаюсь добавить текущего зарегистрированного пользователя в другое отношение как 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}"

1 Ответ

0 голосов
/ 13 сентября 2018

Вам нужно сохранить корзину, прежде чем вы сможете добавлять элементы в поле многие ко многим.

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 вместо этого.Ваше имя_связи members также не имеет смысла.Это используется для привязки тележек к пользователю, поэтому я ожидаю, что вы будете использовать carts.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...