1

私は現在、この不自然なコードに似たモデルのセットを持っています:

class Pizza(models.Model):
    price = models.FloatField()
    topping = models.ManyToManyField(Topping, 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 追加フィールド テーブルで指定された順序でピザのトッピングにアクセスしようとするとどうなるかということです。ピザにチーズとハムがあり、PizzaToppings データの order_to_add_topping がそれぞれ 0 と 1 に設定されているとします。

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

それは「チーズ」と言うべきです。RelationManager は Meta クラス フィールドを尊重していると思いましたが、orderingそうではないようです。したがって、ピザに追加された最初のトッピングの名前へのアクセスは、 で行うべきではないと思いpizza.toppings.all()[0].nameます。

どのようにアクセスすればよいですか?問題はモデル クエリにあるのか、それともモデルの設定方法にあるのか?

4

1 に答える 1

7

モデルは問題ありません。追加のフィールドとの「スルー」関係があるため、関係を照会する必要があります。リレーションシップは、ケースではtopping_relationshipとして自動的に作成されるため、クエリは次のようになります。

pizza.toppings.order_by('topping_relationship__order_to_add_topping')
于 2011-01-05T00:53:54.347 に答える