Отношение «многие ко многим» в Django не возвращает заданный объект - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующая модель пользователя

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(null=False, unique=True, max_length=255)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)

, которая имеет отношение ManyToMany с комнатой

class Room(Base):
    name = models.CharField(unique=True, max_length=255)
    room_type = models.CharField(max_length=50, null=True)
    users = models.ManyToManyField(User, related_name='users')

Когда я запускаю следующий запрос,

rooms = user.room_set.all()

Я получаю эту ошибку,

AttributeError: 'User' object has no attribute 'room_set'

Что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Попробуйте это

class Room(Model.models):
    user = models.ForignKey (User,ONCASCADE  = models.delete)
    name = models.CharField(unique=True, max_length=255)
    room_type = models.CharField(max_length=50, null=True)
    users = models.ManyToManyField(User, related_name='users')
0 голосов
/ 31 мая 2018

У вас нет атрибута пользователя в модели комнаты!

Используйте это в классе комнаты:

 users= models.ManyToManyField(User)

См. Также примеры документов django .

0 голосов
/ 31 мая 2018

Это просто потому, что вы изменили related_name на users

users = models.ManyToManyField(User, related_name='users')

Вместо rooms = user.room_set.all() попробуйте rooms = user.users.all().

Обратите внимание, что это большеудобно назвать related_name во множественном числе от class_name, поэтому у вас будет:

class Room(models.Model)
    users = models.ManyToManyField(User, <b>related_name='rooms'</b>)

Если вы хотите использовать один из django classname_set;Просто удалите related_name, чтобы user.room_set.all работал

...