gpt4 book ai didi

python - Django:过滤由联合组成的查询集不起作用

转载 作者:太空狗 更新时间:2023-10-30 00:53:11 34 4
gpt4 key购买 nike

我定义了 3 个与 M2M 关系相关的模型

class Suite(models.Model):
name = models.CharField(max_length=250)
title = models.CharField(max_length=250)
icon = models.CharField(max_length=250)

def __str__(self):
return self.title



class Role(models.Model):
name = models.CharField(max_length=250)
title = models.CharField(max_length=250)
suites = models.ManyToManyField(Suite)
services = models.ManyToManyField(Service)
Actions = models.ManyToManyField(Action)
users = models.ManyToManyField(User)

def __str__(self):
return self.title

在我的一个观点中,我试图收集与特定用户相关的所有Suite。用户可能与包含许多Suite的多个Role相关。然后按名称过滤 Suite。但是滤镜好像没什么效果

queryset = Suite.objects.union(*(role.suites.all() for role in 
self.get_user().role_set.all()))
repr(self.queryset)

'<QuerySet [<Suite: energia>, <Suite: waste 4 thing>]>'

self.queryset = self.queryset.filter(name="energia")
repr(self.queryset)

'<QuerySet [<Suite: energia>, <Suite: waste 4 thing>]>'

查询集中的查询属性在执行过滤器之前不改变其内容:

(SELECT "navbar_suite"."id", "navbar_suite"."name", "navbar_suite"."title", "navbar_suite"."icon" FROM "navbar_suite") UNION (SELECT "navbar_suite"."id", "navbar_suite"."name", "navbar_suite"."title", "navbar_suite"."icon" FROM "navbar_suite" INNER JOIN "navbar_role_suites" ON ("navbar_suite"."id" = "navbar_role_suites"."suite_id") WHERE "navbar_role_suites"."role_id" = 1)

(SELECT "navbar_suite"."id", "navbar_suite"."name", "navbar_suite"."title", "navbar_suite"."icon" FROM "navbar_suite") UNION (SELECT "navbar_suite"."id", "navbar_suite"."name", "navbar_suite"."title", "navbar_suite"."icon" FROM "navbar_suite" INNER JOIN "navbar_role_suites" ON ("navbar_suite"."id" = "navbar_role_suites"."suite_id") WHERE "navbar_role_suites"."role_id" = 1)

最佳答案

django docs 中所述, 只有 count() , order_by() , values() , values_list()并且允许对联合查询集进行切片。您不能对联合查询集进行过滤。

这意味着,您必须先对查询应用过滤器,然后再对它们应用联合。

此外,您甚至可以在不使用 union() 的情况下实现您的目标。 :

Suite.objects.filter(role_set__users=self.get_user(), name="energia")

如果您使用了 related_name,您可能需要调整过滤器中的字段名称或 related_query_namesuites 的定义中Role 中的 M2M 领域模型。

关于python - Django:过滤由联合组成的查询集不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49260393/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com