Модель Django, в которой есть только поля типа "многие ко многим"?

Я пытаюсь хранить ID пользователя и ID листинга в таблице. Я новичок в веб-разработке, и для меня это кажется подходящим моментом для использования ManyToManyField:

class Watchlist(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ManyToManyField(User)
    listing = models.ManyToManyField(Listing)

Когда я пытаюсь сохранить новую запись в базе данных, делая следующее:

            listing_id = self.kwargs['pk']
            item = Listing.objects.get(id=listing_id)
            user_object = self.request.user

            add_to_watchlist = Watchlist(user = user_object, listing = item)
            add_to_watchlist.save()

Я получаю ошибку: TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use user.set() instead.

Я не уверен, что делаю неправильно, я следовал примеру в документации настолько, насколько это возможно.

Вы не можете напрямую присвоить значение ManyToManyField, а используете метод .add(…) [Djang-doc], на что указывает ошибка:

from django.shortcuts import get_object_or_404

item = get_object_or_404(Listing, pk=self.kwargs['pk'])

watchlist = Watchlist.objects.create()
watchlist.user.add(request.user)
watchlist.listing.add(item)

Note: It is often better to use get_object_or_404(…) [Django-doc], then to use .get(…) [Django-doc] directly. In case the object does not exists, for example because the user altered the URL themselves, the get_object_or_404(…) will result in returning a HTTP 404 Not Found response, whereas using .get(…) will result in a HTTP 500 Server Error.


Примечание: Поскольку ManyToManyField относится к коллекции элементов, ManyToManyField обычно дается имя множественного числа . Таким образом, вы можете захотеть рассмотреть возможность переименования user в users.

Вернуться на верх