Django仅在所有ManyToMany字段均匹配dict时查询对象

时间:2019-02-28 18:13:00

标签: python django dictionary django-models django-q

我正在尝试创建一个筛选器测试,其中仅将用户与满足所有要求的programs匹配。用户的输入是字典,例如:

user_dict = [{location: CA, gender: male, skill: crafts}]

programs具有requirements,如下模型所示:

class Program(models.Model):
    name = models.CharField()
    requirements = models.ManyToManyField("Requirement")
class Requirement(models.Model):
    name = models.CharField()
    status = models.CharField()

我希望查询检索所有满足其所有关联programs的{​​{1}}。例如,如果一个名为requirements的{​​{1}}仅具有以下2个要求:

program

将检索它,因为它的所有camp counselor与用户的字典匹配。那里有第三个[{'name': 'location', 'status': 'CA'}, {'name': 'skill', 'status': crafts}]

requirements

然后将不会检索它。但是,如果第三个requirement的{​​{1}}是[{'name': 'gender', 'status': 'female'}] ,它将匹配并被检索。

当前,我正在遍历每个requirement并检查是否存在匹配项,但是我觉得必须有更好的方法来执行此操作:

status

1 个答案:

答案 0 :(得分:0)

如果您有一个字典,例如:

user_dict = {'location': 'CA', 'gender': 'male', 'skill': 'crafts'}

您可以通过查询查询所有程序:

from django.db.models import Q 

query = Q()
for key, value in user_dict.items():
    query |= Q(**{'requirements__name': key, 'requirements__status': value})    
Program.objects.filter(query)

如果我们发现上面的查询,将像:

Q(requirements__name='location', requirements__status='CA') |
Q(requirements__name='gender', requirements__status='male') |
Q(requirements__name='skill', requirements__status='crafts')

因此它将返回所有Requirements以上的程序。