2016-11-24 11 views
0

ピザにはトッピングがあり、トッピングにはメーカーがあり、メーカーには名前があります。同じメーカーがすべてのトッピングを作成したとしましょう。クエリ内のall()[0]はそうしかしドット表記を使用して、多対多の関係を通じてフィールドの値にアクセスするにはどうすればよいですか?

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) 

:これは、このようなモデルに基づいています

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

は、私はこのようなクエリからメーカーの値を取得することができますよ醜い。それは次のようになりますので、上記のクエリを書き換えるためのどのような方法があります:

pizza.toppings.manufacturer.name 

私は、クエリはそう単純ではないことができるように、複数のトッピングがあります理解しますが、恐ろしいall()[0]ようです。

ご協力いただきありがとうございます。

答えて

1

すべてのトッピングが同じメーカーで作成されている場合はリレーションをPizzaモデルに入れます。

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.manufacturer.name

アップデートのようにアクセスすることができます

実際に行うことができます

pizza.toppings.first().manufacturer.name 

これは最初のトッピングの製造元の名前を返します

関連する問題