Модель 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, theget_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
.