2011-01-04 16 views
0

私は現在、この不自然なコードに似たモデルのセットがあります。ソート多対多フィールドは

class Pizza(models.Model): 
    price = models.FloatField() 
    topping = models.ManyToManyField(RouteGate, through="PizzaToppings") 

class Topping(models.Model): 
    name = models.CharField(max_length=50) 

class PizzaToppings(models.Model): 
    class Meta: 
     ordering=["order_to_add_topping"] 

    pizza = models.ForeignKey(Pizza) 
    topping = models.ForeignKey(Topping) 
    order_to_add_topping = models.IntegerField() 

を私の問題は、私はピザのトッピングにアクセスしようとすると何が起こるかということですPizzaToppings ManyToMany追加フィールドテーブルで指定された注文。

>>> pizza = Pizza.objects.get(pk=490) 
>>> pizza.toppings.all()[0].name 
'Ham' 

「チーズ」と言うべきです:ピザは、それぞれ0と1にセットPizzaToppingsデータでorder_to_add_toppingとチーズとハムを、持っていると仮定します。私は、RelationManagerがorderingメタクラスのフィールドを尊重していると思ったでしょうが、そうではないようです。だから私はピザに追加された最初のトッピングの名前にアクセスするのはpizza.toppings.all()[0].nameで終わるべきではないと思います。

どのようにアクセスする必要がありますか?モデルクエリーに問題があるのですか、またはモデルのセットアップ方法は?

答えて

4

あなたのモデルは、余分なフィールドとの "スルー"関係を持っているので、関係を照会するだけでいいです。あなたのケースでは、関係はtopping_relationshipとして自動的に作成されるため、クエリは次のようになります。

pizza.toppings.order_by('topping_relationship__order_to_add_topping') 
+0

ほとんどのライフセーバーが、テンプレートでこれをどうしますか?あなたのソリューションはコンソールベースです。コンソール上で私は[ Timo

+0

私はそれを得た。しかし、別の問題:トッピングに外部キーフィールドがあり、アクセス権が必要な場合は、これをどのようにして行いますか?例えば。トッピングはfkとして "リソース"を持ちます。それで、ピザを食べるだけなので、ピザ。トッピングはうまくいかない。 – Timo

関連する問題