Python 向django模型添加过滤器

Python 向django模型添加过滤器,python,django,Python,Django,上下文 嘿,伙计们 假设我有两个模型:人和属性通过多人关系连接(一个人可以有多个属性,一个属性可以被多人共享) 属性可以是头发颜色、位置、大学学位等 例如,一个属性的“属性名称”可能是“计算机科学”,而“属性类型”可能是“D”(表示学位) 另一个例子是“伦敦”、“L” 问题 在此网页上,用户可以按属性选择人员。例如,他们可能希望看到所有居住在伦敦并且拥有历史和生物学学位(所有和关系)的人 我理解这可以用以下形式表示(易读性中断): 但是,用户可以同样要求具有四个不同学位的用户。关键是,我们不

上下文

嘿,伙计们

假设我有两个模型:属性通过多人关系连接(一个人可以有多个属性,一个属性可以被多人共享)

  • 属性可以是头发颜色、位置、大学学位等
  • 例如,一个属性的“属性名称”可能是“计算机科学”,而“属性类型”可能是“D”(表示学位)
  • 另一个例子是“伦敦”、“L”
问题

在此网页上,用户可以按属性选择人员。例如,他们可能希望看到所有居住在伦敦并且拥有历史和生物学学位(所有和关系)的人

我理解这可以用以下形式表示(易读性中断):

但是,用户可以同样要求具有四个不同学位的用户。关键是,我们不知道用户将在搜索功能中要求多少属性。

问题

  • 因此,如果我们不知道有多少个过滤器,以及用户将请求哪些类型的属性,那么添加这些过滤器的最佳方式是什么
  • 像这样附加过滤器是最好的方法吗
谢谢


尼克

使用Q模块进行复杂查找

例如:

from django.db.models import Q
Person.objects.get(Q(attributes__attribute_name='London') | Q(attributes__attribute_name='History')
QuerySet
a
|
充当OR和
充当and,这与预期差不多


更改过滤器的问题是,您只能在它们之间实现AND逻辑,因为复杂的AND或NOT逻辑Q是更好的选择。

您可以获得用户选择的所有属性,然后迭代:

# sel_att holds the user selected attributes.

result = Person.objects.all()

for att in sel_att:
    result = result.filter(
        attributes__attribute_name=att.attribute_name, 
        attributes__attribute_type=att.attribute_type
    )

我试过Q,但这会让我看到所有人至少有一个这样的属性,而我希望所有人都有这些属性。其次,不幸的是,这个查询特别不适用于符号,当我用符号尝试它时,它不会返回任何结果。我认为这是这个数据设计最好的方法,但我个人会从
result=Person.objects.all()开始
在遍历
sel_att
列表之前-我认为可读性更好。对于OP-如果您可以选择不同的数据模型,您可能会从中受益。谷歌“实体属性值”进行一些讨论。完美。我让它工作!谢谢,雷德尔。彼得,非常感谢你的提示-我会读的!
from django.db.models import Q
Person.objects.get(Q(attributes__attribute_name='London') | Q(attributes__attribute_name='History')
# sel_att holds the user selected attributes.

result = Person.objects.all()

for att in sel_att:
    result = result.filter(
        attributes__attribute_name=att.attribute_name, 
        attributes__attribute_type=att.attribute_type
    )