首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨多个外键遍历Django权限

问跨多个外键遍历Django权限
EN

Stack Overflow用户
提问于 2022-06-24 20:18:49
回答 1查看 45关注 0票数 1

我有四个核心实体模型:

Collection的所有者或参与者可以是

  • 用户
    • 。

  • Collection
  • Recipe
    • 食谱有一个collection

的外键

一个步骤有一个recipe的外键

为了实现上述功能,我想我需要一个模型(我们称之为CollectionContributor)和一个模型,其中包含以下字段:

  • 贡献者-这将是用户
  • 的外键,这将是集合

的外键。

那么,在Collection上,我会在许多字段中添加许多类似于以下内容的内容:

代码语言:javascript
复制
class Collection(models.Model):
    ...
    contributors = models.ManyToManyField(settings.AUTH_USER_MODEL, through='CollectionContributor')

现在,假设我想提供一个页面,列出所有菜谱中的所有“步骤”。如果我想将这个视图限制在那些作为用户可以访问的集合的一部分的菜谱中的步骤,我将如何做到这一点。基本上,如何管理需要遍历多个外键的权限?

我想可能是这样的。但是它看起来效率很低,如果实体深入几个层,可能会导致性能问题。这样做是对的吗?

代码语言:javascript
复制
def someViewOfSteps(request):
    collections = models.Collection.objects.filter(Q(contributors__in=request.user))
    recipes = models.Recipe.objects.filter(Q(collection__in=collections))
    steps = models.Step.objects.filter(Q(recipe__in==recipe))
    return steps

是那么回事吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-24 20:20:55

您可以通过以下方式查询:

代码语言:javascript
复制
def someViewOfSteps(request):
    return Step.objects.filter(
        recipe__collection__contributors=request.user
    )

这将使用JOIN,而不是带有子查询的… IN …,而子查询往往效率较低,特别是在MySQL中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72749019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档