конфликт между отношениями OneToMany и OneToOne в Джанго - PullRequest
0 голосов
/ 06 ноября 2011

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

from django.db import models
from django.contrib.auth.models import User

class Meeting(models.Model):
    organizer=models.ForeignKey(User)
    participants=models.ManyToManyField(User)

Однако при запуске syncdb я получил следующую ошибку

Ошибка: одна или несколько моделей не прошли проверку: hub.meeting: средство доступа для Поле 'Organizer' конфликтует с соответствующим полем m2m 'User.meeting_set'. Добавьте аргумент related_name в определение для «организатора». hub.meeting: Accessor для столкновений «участников» поля m2m с связанное поле 'User.meeting_set'. Добавьте аргумент related_name к определение для «участников».

Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 06 ноября 2011
class Meeting(models.Model):
    organizer=models.ForeignKey(User, related_name="meetings_orginizer")
    participants=models.ManyToManyField(User, related_name="meetings_participants")

Если у вас есть объект пользователя и вы хотите проследить отношения назад, чтобы найти либо собраний, пользователь которых является организатором , либо собраний, в которых пользователь является участником , вам нужно специально назвать поле «related_name» в модели, чтобы различать их. Теперь вы можете следить за отношениями в обратном направлении, вот так:

me = User.objects.get(id=0)
# Meetings I'm organising
m1 = me.meetings_orginizer.all()
# Meetings I'm participating in
m2 = me.meetings_participants.all()
1 голос
/ 06 ноября 2011

проблема (как указано в сообщении об ошибке) связана с обратными отношениями. когда вы определяете внешний ключ (или many2many), django устанавливает обратное отношение User.meeting_set. однако, поскольку у вас есть два отношения, обратные отношения вступают в конфликт, и вы должны указать связанные имена вручную. см. документы здесь и здесь

код как в ответе выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...