【问题标题】:What is the best data structure for one to many relation on Django?Django上一对多关系的最佳数据结构是什么?
【发布时间】:2023-03-09 09:19:01
【问题描述】:

例如,假设我们有一个带有PizzaToppings 的webapp。

一个披萨可以有很多配料,但一个配料不能有很多披萨,目前看来这是合乎逻辑的。

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

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)

有没有更好的方法或者保持这样的最佳方式?

【问题讨论】:

    标签: python django data-structures


    【解决方案1】:

    一个浇头可以有很多比萨饼。浇头并不特定于特定的比萨 - 意大利辣香肠可以放在任意数量的比萨上,并且您不希望每个比萨上都有一个名为“pepperoni”的单独的浇头实例。多对多是这里合适的结构。

    如果您确实有 ForeignKey,则通过比萨饼本身访问浇头会更惯用:

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

    【讨论】:

    • (只是为了更好地理解 ForeignKey)。如果浇头被定义并且不改变它的价值,我知道浇头可以有很多比萨饼,但是假设我们有公司和工人,并且我们设置了这个规则,工人不能在很多公司,最好使用外键?
    • 是的,这正是 ForeignKey 的用途;一个工人会有一个字段company = models.ForeignKey(Company),
    【解决方案2】:

    好的,我会说清楚(我想)

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

    1-n : ForeignKey

    为什么?

    1. 这是关于查询样式的。模型 Pizza 将有 n 个 Topping 与之相关,对吗?

    pizza1 = Pizza.Objects.get(pk=1)

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

    这样,我们有topping_for_pizza1.pizza 会返回pizza 对象。 并且查询 _set 也可以。

    ManytoMany 是 2 种方式的关系,这意味着 2 个 FK。我就是这么想的。

    希望对您有所帮助,请使用 FK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多