我有两个型号。一个代表一件设备,另一个代表设备的可能属性。在语义上,这可能看起来像:
tractor
,属性:wheels
,towing
lawnmower
,属性:wheels
,blades
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)
测试属性 - 但这似乎是错误的。
答案 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。