【问题标题】:Django many-to-many relationship doesn't return set objectDjango多对多关系不返回集合对象
【发布时间】:2018-11-09 20:59:24
【问题描述】:

我有以下用户模型

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'

我在这里做错了什么?

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    只是因为你把related_name改成了users

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

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

    请注意,将 related_name 命名为 class_name 的复数更方便,因此您可以:

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

    如果你想使用 django classname_set 之一;只需删除related_nameuser.room_set.all 就可以了

    【讨论】:

      【解决方案2】:

      Room 模型中没有用户属性!

      在房间类中使用它:

       users= models.ManyToManyField(User)
      

      另见django doc examples

      【讨论】:

      • 我不得不说这是最简单的答案。
      【解决方案3】:

      试试这个

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

      【讨论】:

        猜你喜欢
        • 2019-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 2013-08-20
        • 1970-01-01
        • 2016-09-30
        • 1970-01-01
        相关资源
        最近更新 更多