Python Django queryset翻转
有没有办法在Django查询集中翻转关系例如,如果所有Foo对象都有一个指向Bar的外键,则将Foo查询集转换为Bar查询集? 以以下为例:Python Django queryset翻转,python,django,django-queryset,Python,Django,Django Queryset,有没有办法在Django查询集中翻转关系例如,如果所有Foo对象都有一个指向Bar的外键,则将Foo查询集转换为Bar查询集? 以以下为例: #condition_n are previously defined statements that results in either True or False if condition_1: foo_qs = Foo.objects.filter(bar__something=...) if condition_2:
#condition_n are previously defined statements that results in either True or False
if condition_1:
foo_qs = Foo.objects.filter(bar__something=...)
if condition_2:
foo_qs = foo_qs.filter(bar__another_thing=...)
if condition_3:
#you get the point
现在,这将导致一些查询集foo\u qs
,具体取决于condition\u n
类型语句的评估。如果我还想获得由此产生的bar queryset,我可以执行以下操作:
#condition_n are previously defined statements that results in either True or False
if condition_1:
foo_qs = Foo.objects.filter(bar__something=...)
bar_qs = Bar.objects.filter(something=...)
if condition_2:
foo_qs = foo_qs.filter(bar__another_thing=...)
bar_qs = Bar.objects.filter(another_thing=...)
if condition_3:
#you get the point
但理想情况下,我希望获取任何查询集,并给它外键的名称(在本例中为“bar”),然后将其翻转到等效的查询集有没有办法做到这一点?
例如,如果所有的Foo对象都有一个指向Bar的外键,那么将Foo查询集转换为Bar查询集
为什么不呢?这里有一种方法,如果您总是将基本查询编写为相关对象的本地查询
bar_query = {
'something': 'something',
}
def prefix_fk(query, prefix):
prefixed_query = {}
for key, value in query.items():
prefixed_query[prefix+key] = value
return prefixed_query
Foo.objects.filter(**prefix_fk(bar_query, 'bar__'))
Bar.objects.filter(**bar_query)
if condition_2:
bar_query['another_query'] = 'foobar'
Foo.objects.filter(**prefix_fk(bar_query, 'bar__'))
Bar.objects.filter(**bar_query)
我没有时间给出正确的答案,但是-使用Q对象,您可以执行
Q(**{'key':'value'})
。键只是一个字符串,所以很容易操作请放一些真正的代码。。。以及你期望得到的。。。。不清楚(至少我不清楚)您要求的是什么(可能还包括一个简化的bar/foo模型类),为什么不如上所述构造bar\u qs
queryset,然后使用foo.objects.filter(bar\u in=bar\u qs)获得foo\u qs
queryset
?@KevinChristopherHenry,因为实际情况要复杂得多,我实际上无法对qs\u条进行查询设置easily@RyanSaxe这不是你想要的答案吗?(如果是,为什么?)