首页 > 解决方案 > 如果组合 django 中不存在任何一个输入,python 过滤器将返回 none

问题描述

我正在为文学创建一个模型,我们可以在其中输入英语、德语、法语等。我的模型可能包含英语、德语、法语。如果我将这 3 个值放入其中,它会向我显示正确的输出,但如果键入英语、德语,则它不会返回任何内容,因为一个条件失败,但实际上我希望它以这样一种方式返回,即如果满足该条件,它会返回该特定对象,如果我写的是英语、德语、法语和模型只包含英语、德语它应该返回英语、德语而不是无

def resolve_codepool_advanced_lang5(root,info,lang1,lang2,lang3,lang4,lang5):
        return Codepool_Advanced.objects.filter(codepool_advanced_language1=lang1,codepool_advanced_language2=lang2,codepool_advanced_language3=lang3,codepool_advanced_language4=lang4,codepool_advanced_language5=lang5)

标签: pythonpython-3.xdjangodjango-models

解决方案


你必须使用Q 对象

from django.db.models import  Q


def resolve_codepool_advanced_lang5(root,info,lang1,lang2,lang3,lang4,lang5):
        return Codepool_Advanced.objects.filter(Q(codepool_advanced_language1=lang1)| Q(codepool_advanced_language2=lang2)| Q(codepool_advanced_language3=lang3)| Q(codepool_advanced_language4=lang4)| Q(codepool_advanced_language5=lang5))

总结上面的查询,查询是检查 codepool_advanced_language1=lang1 或 codepool_advanced_language2=lang2 或 codepool_advanced_language3=lang3 等等。

“|” 是OR运算符

您可以在此处了解有关 django Q 对象的更多信息

编辑: 根据问题作者的评论添加额外的答案。

是的,有一个解决方案

def resolve_codepool_advanced_lang5(root,info,lang1,lang2,lang3,lang4,lang5):
    languages = [lang1,lang2,lang3,lang4,lang5]
    return Codepool_Advanced.objects.filter(Q(codepool_advanced_language1__in=languages)| Q(codepool_advanced_language2__in=languages)| Q(codepool_advanced_language3__in=languages)| Q(codepool_advanced_language4__in=languages)| Q(codepool_advanced_language5__in=languages))

您可以拥有列表中的所有语言,并且可以像这样使用它,

如:Q(codepool_advanced_language1__in=languages)|Q(codepool_advanced_language2__in=languages)|等等。


推荐阅读