【问题标题】:many to many relationship in django database modeldjango数据库模型中的多对多关系
【发布时间】:2019-02-09 15:43:27
【问题描述】:

您好,我是 python 的新手,第一次在 mysql 中实现 ORM。

我们有三个两张表和一张中间表,如下图所示

下面是我们用来创建模型的代码

class Roles(models.Model):
    """
    A class that stores all the types of roles that are available to the user
    """
    role_id = models.CharField(max_length=200, blank=False,primary_key=True)
    role_name = models.CharField(max_length=200)

    class Meta:
        db_table = 'roles'
        managed = False


class User(AbstractBaseUser):
# class ChannelUser(models.Model):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    """
    user_id = models.CharField(max_length=200, blank=False,primary_key=True)
    user_email = models.EmailField(max_length=200, blank=False, unique=True)
    roles=models.ManyToManyField(
        Roles,
        through='UserRole',
        # through_fields=('user_id', 'role_id'),
    )

    USERNAME_FIELD = 'user_email'

    class Meta:
        db_table = 'user'
        managed = False

class UserRole(models.Model):
    """
    A class that stores user ids and role ids
    """
    user = models.ForeignKey(User, on_delete=models.PROTECT, db_column='user_id')
    role = models.ForeignKey(Roles, on_delete=models.PROTECT, db_column='role_id') 
    timestamp = models.DateTimeField(default=timezone.now)   

    class Meta:
        db_table = 'user_roles'
        managed = False

我们正在尝试获取与User 关联的所有Roles,但它为roles 提供了None。

我不确定,我们在这里做错了什么。谁能指出来。

下面是我用来获取角色的代码

user_detail = User.objects.get(user_email=username)
print(user_detail.user_email)  //prints user email
print(user_detail.roles) // prints Roles.None

settings.py

AUTH_USER_MODEL = "login_api.User"

【问题讨论】:

  • 您需要显示用于获取角色的代码。
  • 你的代码是什么?
  • @DanielRoseman 请看一下,我已经更新了代码
  • @rakwen 请看一下,我已经更新了代码
  • 没有办法打印无。它将打印“ManyRelatedManager”,因为角色是一个多对多字段,可让您访问相关角色的查询集

标签: python django django-models


【解决方案1】:

访问特定模型实例(而不是模型的管理器)时,您可以使用modelname_set 而不是modelname 访问相关项目。例如:

>>> user_detail.roles_set.remove(my_role)
>>> user_detail.roles_set.all()
<QuerySet []>

文档:

https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/

【讨论】:

  • 我在尝试你的方法时遇到了给定的错误 print(user_details.roles_set.all()) AttributeError: 'User' object has no attribute 'roles_set'
  • 我想显而易见的问题是,是否已为每个用户分配了角色?另外,你做过数据库迁移吗?
  • 是的,我已经使用了这些命令 python manage.py makemigrationspython manage.py migrate。到目前为止,数据库中只有一个用户,并且该用户的角色条目存在
  • 您的 AUTH_USER_MODEL 在 settings.py 中设置为什么?如果你给 User 添加另一个字段,迁移它,你可以访问它吗?
  • 已更新问题,是的,我可以访问任何新的附加字段
猜你喜欢
  • 2018-01-04
  • 2019-05-09
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2015-02-03
相关资源
最近更新 更多