Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用GenericForeignKey对象数组进行Queryset筛选_Python_Django_Orm - Fatal编程技术网

Python 使用GenericForeignKey对象数组进行Queryset筛选

Python 使用GenericForeignKey对象数组进行Queryset筛选,python,django,orm,Python,Django,Orm,问题出在这里 我有一个表,其中包含将用户与由GenericForeignKey定义的对象关联的记录 我可以获得以下对象的列表: association_objects = Association.objects.filter(user = request.user) 这将返回一个对象数组,我可以使用 association_object.context 因此,我可以轻松地创建一个仅包含上下文对象的数组 现在,我需要查询与上述关联数组中的任何对象相关的另一个表的所有记录 在一个美好而神圣的宇宙

问题出在这里

我有一个表,其中包含将用户与由GenericForeignKey定义的对象关联的记录

我可以获得以下对象的列表:

association_objects = Association.objects.filter(user = request.user)
这将返回一个对象数组,我可以使用

association_object.context
因此,我可以轻松地创建一个仅包含上下文对象的数组

现在,我需要查询与上述关联数组中的任何对象相关的另一个表的所有记录

在一个美好而神圣的宇宙中,我可以做类似的事情

Action.objects.filter(context__in = associations)
其中该表中的上下文也是GenericForeignKey

但是,不能根据GFK的实际密钥属性对其进行筛选。您必须同时按内容类型和主键进行筛选

我该怎么做?我唯一的好主意是将内容类型和id分成两个单独的数组,并在两个属性上的过滤器中进行过滤,但这似乎并不实际可行

有人有什么好主意吗?

试试这个:

# I assume that association_objects is a QuerySet
association_ids = association_objects.value_list("id", flat=True)
content_type = ContentType.objects.get_for_model(Association)
actions = Action.objects.filter(content_type=content_type,
                                object_id__in=association_ids)

(假设您的
GenericForeignKey
content\u type
object\u id
!)组成)

但如果我理解正确,content\u type可以是可变的。关联的对象可以是数据库中的任何模型。是的,内容类型可以引用任何模型。但是在您的情况下,您只需要选择
关联
s,对吗?注:我刚刚更正了我的答案(第二行)。不,也许我没有把问题说清楚(只是大声思考)。关联通过GFK与任何对象关联。。。从GFK到行动。。。。将关联视为用户和操作之间的链接器表。我需要使用关联作为从用户到基于任何必要对象上下文(数据库中的任何模型)的操作的桥梁。您可以更新您的问题并包含模型的代码吗?不是所有的,只是你定义关系的部分。你有没有找到答案?我也需要它!
from django.contrib.contenttypes.models import ContentType

ct = ContentType.objects.get_for_model(Action)
action_ids = association_objects.values_list("object_id", flat=True)\
                                .filter(content_type=ct)
actions = Action.objects.filter(pk__in=action_ids)