具有可过滤属性的Django模型

时间:2010-02-06 01:39:55

标签: python sql mysql django django-models

我有两个型号。一个代表一件设备,另一个代表设备的可能属性。在语义上,这可能看起来像:

  • 设备:tractor,属性:wheelstowing
  • 设备:lawnmower,属性:wheelsblades
  • 设备:hedgetrimmer,属性:blades

我想提出像

这样的查询
wheels = Attributes.objects.get(name='wheels')
blades = Attributes.objects.get(name='blades')

Equipment.objects.filter(has_attribute=wheels) \
    .exclude(has_attribute=blades)

如何创建Django模型来执行此操作?

这看起来很简单,但我太过密集而无法找到合适的解决方案。

突然出现的一个解决方案是在Attribute之类的整数列表中编码|109|14|3 ID列表,并使用Equipment.objects.filter(attributes_contains='|%d|' % id)测试属性 - 但这似乎是错误的。

1 个答案:

答案 0 :(得分:1)

你的第二个例子非常接近,但你需要了解QuerySet API works across relationships (i.e. joins)

的方式
class Attribute(models.Model):
    name = models.CharField(max_length=20)

class Equipment(models.Model):
    name = models.CharField(max_length=20)
    attributes = models.ManyToManyField(Attribute)

equips = Equipment.objects.filter(
    attributes__name='wheels').exclude(attributes__name='blades')

您可以在QuerySet中使用Q对象进行更有趣的查询。

请记住,您始终可以从QuerySet中转储SQL,如下所示:

print equips.query.as_sql()

有时您会希望看到生成的确切SQL,以确保您正确使用API​​。