Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 Django queryset翻转_Python_Django_Django Queryset - Fatal编程技术网

Python Django queryset翻转

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:

有没有办法在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:
        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这不是你想要的答案吗?(如果是,为什么?)