#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
внешний ключ и astatus_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. Смотрите Мой комментарий в ответе выше.