【问题标题】:Django query an object only if all ManyToMany fields match dict仅当所有 ManyToMany 字段都匹配 dict 时,Django 才查询对象
【发布时间】:2019-07-22 17:30:34
【问题描述】:

我正在尝试创建一个筛选器测试,其中用户仅与满足所有要求的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()

我希望查询检索所有相关联的requirements 满足的所有programs。例如,如果一个名为 camp counselorprogram 仅具有以下 2 个与之关联的要求:

[{'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"

【问题讨论】:

  • 你需要让所有程序都符合要求吗?
  • 是的,我需要检索完全满足requirements 的所有程序
  • 是字典列表吗?我的意思是user_dict?
  • 不只是一个字典,具有通过筛选器获得的各种属性(即性别、技能、位置)
  • 请检查我的回答,如果它为您提供了您将要做什么。如有任何问题,请留下您的评论。

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


【解决方案1】:

如果你有一个像这样的字典:

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 的程序。

【讨论】:

  • 这是否还包括一个program,它不需要此特定user_dict 中列出的所有3 个属性(即它的唯一要求是{'location': 'CA', 'skill': 'crafts'})?或者,它是否排除了programs 列出了不是user_dict 中的键的其他requirements(即{'education': 'masters'})?
  • 如果这些要求中的任何一个与程序相关联,它将返回。如果您将不存在的键添加为要求的属性,则会出现错误。
  • 是否可以从每个program 开始,只返回所有关联requirements 都满足user_dict 的那些?
  • 您是指与您的字典中列出的至少 3 个要求相关的程序吗?
  • 唯一重要的是与返回的所有programs 关联的requirementsuser_dict 满足。除此之外,user_dict 中包含哪些其他数据并不重要。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
相关资源
最近更新 更多