【问题标题】:Django Models: How to express the following logic...?Django Models:如何表达以下逻辑......?
【发布时间】:2013-04-22 19:01:02
【问题描述】:

我在架构上遇到困难,我需要以下逻辑方面的帮助。

我有一张桌子Client 和一张桌子Rights。表Client 表示具有某些属性的客户端,表Rights 表示每个客户端的可用权限。

所以,我想为客户分配一个可用权限列表(每个用户可以有不同的权限,但都来自表Rights),我该如何在模型中做到这一点?

在那之后,我如何检索分配给他的Client Rights

客户

name = models.CharField(max_length=256)
user = models.ForeignKey(User)
bio = models.TextField(null=True, blank=True)
website = models.URLField(null=True)

权利

key = models.CharField(unique=True, max_length=255, db_index=True)
title = models.CharField(max_length=100, blank=True)
description = models.TextField(blank=True)

提前致谢!

【问题讨论】:

    标签: database django django-models many-to-many one-to-many


    【解决方案1】:

    使用多对多字段

    class Rights(models.Model):
        key = models.CharField(unique=True, max_length=255, db_index=True)
        title = models.CharField(max_length=100, blank=True)
        description = models.TextField(blank=True)
    
    class Client(models.Model):
        name = models.CharField(max_length=256)
        user = models.ForeignKey(User)
        bio = models.TextField(null=True, blank=True)
        website = models.URLField(null=True)
        rights = models.ManyToManyField(Rights)
    

    您可以获得客户端的所有权利

    c = Client.objects.get(id=1)
    rights = c.rights.all()
    

    【讨论】:

    • 问题:rights = c.rights.all() 将是Rights 的实例还是Client 的实例?
    • rights 将是一个查询集,它将告诉您分配给客户端 c 的所有权限。 c 是客户端的一个实例。
    【解决方案2】:

    只需在您的客户端模型中使用 ManyToMany 字段。毕竟这是多对多的关系。

    如果每个权限对每个客户端都是唯一的,则使用从权限到客户端的 ForeignKey。

    【讨论】:

      【解决方案3】:

      Jorge,抱歉,我没有足够的业力直接回复您的评论。

      Question: The rights = c.rights.all() will be instance of Rights or instance of the Client?
      

      -> Rights 个实例。

      链接到Client 对象的所有Rights 实例。

      【讨论】:

      • 我已经对此进行了一些测试,我发现它既不能识别为Right 也不能识别为Client,而是识别为django.db.models.query.QuerySet。示例:isinstance(<variable_instance>, django.db.models.query.QuerySet) 给出 True
      • 是的,它是一个包含权限实例的查询集。 print rights[0]
      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2019-10-21
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多