我正在尝试创建一个筛选器测试,其中仅将用户与满足所有要求的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
答案 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
以上的程序。