在Django模型中自动排序ManyToMany字段

1 投票
1 回答
3052 浏览
提问于 2025-04-16 09:25

我现在有一组模型,长得像下面这段代码:

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这个多对多关系表中指定的顺序来访问披萨的配料时,会发生什么。假设这块披萨上有奶酪和火腿,而PizzaToppings数据中的配料添加顺序分别设置为0和1:

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

这应该显示“奶酪”。我本以为关系管理器会尊重ordering这个元类字段,但看起来并不是这样。所以我想,访问披萨上第一个添加的配料名称时,不应该用pizza.toppings.all()[0].name

那应该怎么访问呢?是我的模型查询有问题,还是我设置模型的方式不对?

1 个回答

7

你的模型没问题,只需要查询一下关系,因为现在你有一个“通过”关系,并且还有额外的字段。这个关系在你的情况下会自动创建为topping_relationship,所以你的查询应该是:

pizza.toppings.order_by('topping_relationship__order_to_add_topping')

撰写回答