Django上一对多关系的最佳数据结构是什么?

时间:2018-01-26 10:04:46

标签: python django data-structures

例如,假设我们有一个包含PizzaTopping s的网络应用。

一个披萨可以有很多浇头,但顶部不能有很多比萨饼,这似乎是合乎逻辑的。

我正在使用下面这样的结构,但我不确定我应该使用ManyToMany Field还是ForeignKey,因为OneToMany在Django上不存在。

class Pizza(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    order_id = models.CharField(max_length=255)

    def __str__(self):
        return self.order_id

class Topping(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    custom_topping_name = models.CharField(max_length=255)
    pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE) #if a pizza is deleted, delete its toppings.

    def __str__(self):
        return self.topping_name

如果我这样做,我应该像这样买披萨及其所有的配料吗?

pizzas = Pizza.topping_set.filter(order_id=my_order_id)

是否有更好的方法或保持这样的最佳方式?

2 个答案:

答案 0 :(得分:1)

一流的可以有很多比萨饼。顶部不是特定于特定的披萨 - 意大利辣香肠可以放在你喜欢的多个披萨上,并且你不希望每个披萨上都有一个名为“pepperoni”的单独的Topping实例。这里的多对多是适当的结构。

如果你确实有一个ForeignKey,通过比萨饼本身访问浇头更为惯用:

my_pizza = Pizza.objects.get(order_id=order_id)
toppings = my_pizza.topping_set.all()

答案 1 :(得分:0)

好的,我会说清楚(我认为)

Django上一对多关系的最佳数据结构是什么?

1-n:ForeignKey

为什么?

  1. 关于查询风格。模型Pizza会有n Topping与它相关吗?
  2. pizza1 = Pizza.Objects.get(pk=1)

    topping_for_pizza1 = Topping.Objects.filter(pizza=pizza1)
    

    通过这种方式,我们有topping_for_pizza1.pizza将返回披萨对象。 和查询_set也可以。

    ManytoMany是两种方式关系,它意味着2 FK。我只想到它。

    希望它有所帮助,请使用FK pls

相关问题