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
)