Как сделать обратную связь между двумя моделями в одном приложении?

#django #django-models

#джанго #django-модели #django

Вопрос:

Как сделать обратную связь между двумя моделями в одном приложении?

 class User(AbstractUser):
    user_status = models.ForeignKey(Status)


class Status(models.Model):
    users = models.ManyToManyField(User, blank=True)
  

Ответ №1:

Django делает это автоматически для вас. Поэтому вам не следует указывать его как поле в соответствующей модели.

Снимите кнопку ManyToManyField вкл Status . Затем, если у вас есть Status объект, вы можете ссылаться на обратную связь status.user_set.all() . Или, вы можете добавить a related_name к ForeignKey , вы можете использовать пользовательское имя:

 user_status = models.ForeignKey(Status, related_name="users", on_delete=models.SET_NULL, null=True, blank=True)
  

Обратите внимание, что я добавил on_delete , поскольку это требуется в Django 2.x заставляет вас указать, что должно произойти, если файл Status будет удален.

 status = Status.objects.first()
status.users.all()  # all users for that status
  

Комментарии:

1. Мне нужно, чтобы на странице администратора также был select (ForeignKey mb), который ссылался бы на все записи из модели состояния

2. Это то, что вы получите автоматически, вам не нужно ничего делать. A ForeignKey отобразится в admin в виде выпадающего списка всех возможных объектов из связанной модели.

3. почему? может ли пользователь иметь несколько статусов?

4. Вы не поняли. У меня есть class Status . В нем должно быть поле user_status , которое ссылается на class User ( MTM ). В User class есть status field . Он должен ссылаться на Status class ( FK ) .

5. Если вы делаете то, что говорите, у пользователя будет 2 поля статуса: status внешний ключ и a status_set со всеми статусами, которые имеют отношение m2m к этому пользователю. Это действительно то, что вам нужно? Я думаю, вы неправильно понимаете FK и M2M.

Ответ №2:

Вы можете получить доступ к статусам для пользователя с помощью status_set :

 user = User.objects.first()
user.status_set.all() # get all status of a user
  

Вы можете присвоить обратному с related_name аргументом другое имя:

 class Status(models.Model):
    users = models.ManyToManyField(User, blank=True, related_name='states')


user = User.objects.first()
user.states.all()
  

Многие ко многим официальная документация

Комментарии:

1. Мне нужно, чтобы на странице администратора также была функция select ( ForeignKey ), которая ссылалась бы на все записи из Status модели.

2. Но вам нужно одно или два отношения? В вопросе у вас есть два отношения: ForeingKey и ManyToMany. В администраторе вы можете выбрать для установки значения user_status , но это значение не имеет никакого отношения к полю users Status модели.

3. Смотрите Мой комментарий в ответе выше.