例如,假设我们有一个包含Pizza
和Topping
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)
是否有更好的方法或保持这样的最佳方式?
答案 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
为什么?
pizza1 = Pizza.Objects.get(pk=1)
topping_for_pizza1 = Topping.Objects.filter(pizza=pizza1)
通过这种方式,我们有topping_for_pizza1.pizza将返回披萨对象。 和查询_set也可以。
ManytoMany
是两种方式关系,它意味着2 FK。我只想到它。
希望它有所帮助,请使用FK pls