Django多对多关系不返回set对象

时间:2018-05-30 22:40:12

标签: python django django-models django-orm

我有以下用户模型

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 :(得分:3)

这只是因为您已将 related_name 更改为users

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

而不是rooms = user.room_set.all()尝试rooms = user.users.all()

请注意,使用复数class_name命名 related_name 会更方便,因此您可以:

class Room(models.Model)
    users = models.ManyToManyField(User, related_name='rooms')

如果你想使用django classname_set;只需删除related_name,即user.room_set.all即可使用

答案 1 :(得分:1)

试试这个

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')

答案 2 :(得分:1)

您在房间模型中没有用户属性!

在房间类中使用:

 users= models.ManyToManyField(User)

另见django doc examples