我有四个核心实体模型:
Collection的所有者或参与者可以是
的外键
一个步骤有一个recipe的外键
为了实现上述功能,我想我需要一个模型(我们称之为CollectionContributor)和一个模型,其中包含以下字段:
的外键。
那么,在Collection上,我会在许多字段中添加许多类似于以下内容的内容:
class Collection(models.Model):
...
contributors = models.ManyToManyField(settings.AUTH_USER_MODEL, through='CollectionContributor')现在,假设我想提供一个页面,列出所有菜谱中的所有“步骤”。如果我想将这个视图限制在那些作为用户可以访问的集合的一部分的菜谱中的步骤,我将如何做到这一点。基本上,如何管理需要遍历多个外键的权限?
我想可能是这样的。但是它看起来效率很低,如果实体深入几个层,可能会导致性能问题。这样做是对的吗?
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是那么回事吗?
发布于 2022-06-24 20:20:55
您可以通过以下方式查询:
def someViewOfSteps(request):
return Step.objects.filter(
recipe__collection__contributors=request.user
)这将使用JOIN,而不是带有子查询的… IN …,而子查询往往效率较低,特别是在MySQL中。
https://stackoverflow.com/questions/72749019
复制相似问题