2010-02-06 21 views
1

我有兩個模型。一個代表一個設備,另一個代表設備可能的屬性。在語義上,這可能是這樣的:具有可過濾屬性的Django模型

  • 設備: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模型來執行此操作?

這看起來很簡單,但我太密集,看不到正確的解決方案。這突然出現在我的腦海

一種解決方案是在編碼整數列表像|109|14|3和測試使用Equipment.objects.filter(attributes_contains='|%d|' % id)屬性Attribute ID的列表 - 但這似乎真的錯了。

回答

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​​。

+0

這有助於。謝謝! – 2010-02-06 08:23:15