[英]Django filter object by ManyToMany and only return those ManyToMany relationships that match
[英]Django query an object only if all ManyToMany fields match dict
我正在嘗試創建一個篩選器測試,其中僅將用戶與他們滿足所有要求的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
的,他們的所有相關requirements
得到滿足。 例如,如果一個名為“ camp counselor
的program
僅具有以下兩個相關要求:
[{'name': 'location', 'status': 'CA'}, {'name': 'skill', 'status': crafts}]
將檢索它,因為它的所有requirements
與用戶的詞典匹配。 它有第三個requirement
:
[{'name': 'gender', 'status': 'female'}]
然后將無法檢索它。 但是,如果該第三個requirement
的status
為male
,它將匹配並被檢索。
當前,我正在遍歷每個program
並檢查是否存在匹配項,但是我覺得必須有一種更好的方法來執行此操作:
for p in program:
for r in p.requirements.all():
if user_dict[r.name] == r.status:
print "Match"
else:
print "No Match"
如果您有一個像dict這樣的字典:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.