python - 将过滤器附加到 django 模型

标签 python django

上下文

大家好,

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

class Attribute(models.model):
  attribute_name = models.CharField(max_length=100)
  attribute_type = models.CharField(max_length=1)

class Person(models.model):
  article_name = models.CharField(max_length=100)
  attributes = models.ManyToManyField(Attribute)
  • 属性可以是头发颜色、地点、大学学位等。
  • 例如,某个属性的“attribute_name”可能为“计算机科学”,“attribute_type”为“D”(学位)。
  • 另一个例子是“伦敦”、“L”。

问题

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

据我了解,这可以用以下形式表示(为了易读性而中断):

Person.objects
.filter(attributes__attribute_name='London', attributes__attribute_type='L')
.filter(attributes__attribute_name='History', attributes__attribute_type='D')
.filter(attributes__attribute_name='Biology', attributes__attribute_type='D')

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

问题

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

谢谢!

尼克

最佳答案

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

# 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
    )

关于python - 将过滤器附加到 django 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115013/

相关文章:

python - 如何在 vtk 的纹理表面上只显示三角形边界?

Python WMI 网络适配器配置参数问题 [Windows 8.1] [Python 2.7] [WMI 1.4.9]

django - django grappelli 中的自动完成 - 没有 "add"按钮

python - 在 Python 中将当前时间提前一小时

python - .loc() 的轴参数以解释轴上传递的切片器 = 1

python - 使用 setup.py test 和 tox 运行 Django 测试

python - Django:捕获 RequestDataTooBig 异常

django - 访问 Django 关系中的多对多集合字段

python - 在 C 中,如何在没有嵌套函数的情况下为一个函数提供另一个函数的作用域?

django - 将 django 表单中的 bool 模型字段显示为单选按钮而不是默认复选框