ManyToMany Отношения "добавить-удалить-удалить друга" в Django не работают - PullRequest
1 голос
/ 31 марта 2019

Как мне решить эту проблему отношения многих ко многим. Я создаю систему «ДОБАВИТЬ И УДАЛИТЬ ДРУЗЕЙ», такую ​​как Facebook. «если A дружит с B, то B дружит с A».

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, null=True)
    location = models.CharField(max_length=50, null=True, blank=True)

class Friend(models.Model):
    friend_user = models.ManyToManyField(User)

После выбора двух пользователей в Профиле из Admin, чтобы создать отношения с суперпользователем и сохранить их.

Когда я получаю доступ к оболочке, чтобы попробовать приведенные ниже команды, возникают две проблемы:

from django.contrib.auth.models import User
from accounts.models import Friend

После создания экземпляра: friend = Friend() Когда я печатаю: friend Возвращение Shell: <Friend: Friend object (None)>

Я СЧИТАЮ, ЧТО ПРОБЛЕМА С ЛИНИИ ВЫШЕ, ЭТО НЕ ДОЛЖНО ВЕРНУТЬСЯ "НЕТ"

Кроме того, когда я пытаюсь добавить отношения: friend.friend_user.add(User.objects.last()) Возвращение Shell:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/macadmin/Documents/Django_wapps/fbook/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 498, in __get__
    return self.related_manager_cls(instance)
  File "/Users/macadmin/Documents/Django_wapps/fbook/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 795, in __init__
    (instance, self.pk_field_names[self.source_field_name]))
ValueError: "<Friend: Friend object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.

Любая помощь будет очень признателен.

PS: я использую этот урок: https://www.youtube.com/watch?v=nwpLCa79DUw&list=PLw02n0FEB3E3VSHjyYMcFadtQORvl1Ssj&index=54

1 Ответ

1 голос
/ 31 марта 2019

Поскольку "друзья" - это отношение многие ко многим между Profile с, вы можете вернуть свое поле обратно в класс Profile и ссылаться на ту же модель со строкой "self".

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, null=True)
    location = models.CharField(max_length=50, null=True, blank=True)
    friends = models.ManyToManyField("self")

https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ManyToManyField.symmetrical

...