2016-11-24 25 views
0

披薩有澆頭,打頂有製造商,製造商有名稱。假設同一製造商創建所有澆頭。如何使用點符號通過多對多關係訪問字段的值?

我能夠從這樣的查詢得到製造商的價值:

pizza.toppings.all()[0].manufacturer.name 

這是基於模型是這樣的:

class Pizza(models.Model): 
    pizza = models.ManyToManyField(Topping) 

class Topping(models.Model): 
    manufacturer = models.ForeignKey(Manufacturer) 

class Manufacturer(models.Model): 
    name = models.CharField(max_length=255) 

但是在查詢中all()[0]似乎醜陋。有什麼辦法來重寫上面的查詢,所以它看起來是這樣的:

pizza.toppings.manufacturer.name 

我明白有多個澆頭因此該查詢不能這麼簡單,而是all()[0]似乎太可怕了。

感謝您的建議。

回答

1

如果同一製造商創建所有澆頭,則將manufacturer關係放在Pizza模型中。所以,你可以像pizza.manufacturer.name

更新訪問它(因爲你說,你不能改變模型):

from django.utils.functional import cached_property 

class Pizza(models.Model): 
    pizza = models.ManyToManyField(Topping) # this should be called toppings, not pizza 

    @cached_property 
    def manufacturer(self): 
     topping = self.pizza.toppings.first() 
     if topping: 
      return topping.manufacturer 

現在您可以訪問它像pizza.manufacturer

+0

對不起,我不能更改模型。我正在簡化問題,以便更容易理解。問題是我該如何去obj - >多對多關係 - >外鍵 - >使用點符號或類似於點符號的字段。 –

1

而不是

pizza.toppings.all()[0].manufacturer.name 

你實際上可以做

pizza.toppings.first().manufacturer.name 

這將返回製造商名稱的第一打頂

相關問題