簡體   English   中英

Django僅在所有ManyToMany字段均匹配dict時查詢對象

[英]Django query an object only if all ManyToMany fields match dict

我正在嘗試創建一個篩選器測試,其中僅將用戶與他們滿足所有要求的programs匹配。 用戶的輸入是字典,例如:

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

programsrequirements如下圖所示的模型:

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

我想查詢檢索所有programs的,他們的所有相關requirements得到滿足。 例如,如果一個名為“ camp counselorprogram僅具有以下兩個相關要求:

[{'name': 'location', 'status': 'CA'}, {'name': 'skill', 'status': crafts}]

將檢索它,因為它的所有requirements與用戶的詞典匹配。 它有第三個requirement

[{'name': 'gender', 'status': 'female'}]

然后將無法檢索它。 但是,如果該第三個requirementstatusmale ,它將匹配並被檢索。

當前,我正在遍歷每個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM