【问题标题】:Cannot create multiple objects of same name using ForeignKey无法使用 ForeignKey 创建多个同名对象
【发布时间】:2018-12-18 22:58:54
【问题描述】:

我正在创建一个网站来托管我镇上餐馆的不同菜单。在下面的代码中,Restaurant 是餐厅,MenuSection 是开胃菜、主菜、甜点等部分,FoodItem 是您可以订购的菜品,属于菜单上的一个部分。我正在尝试将每个MenuSection 连接到Restaurant,并将每个FoodItem 连接到MenuSectionRestaurant。我认为这可以使用ForeignKey 来实现,因为它是多对一的关系。

显然,餐厅之间的食物部分和食物项目正在重叠。我认为这不是问题,但在我的数据库中我有两个Restaurant 对象,一个已经有一个名为“开胃菜”的MenuSection,我试图给第二家餐厅一个名为“开胃菜”的MenuSection,它会不要让我这样做,说:“MenuItem 和这个MenuSection 已经存在。”我怎样才能解决这个问题?提前感谢您的帮助。

from django.db import models


class Restaurant(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

    def __str__(self):
        return  self.name

class MenuSection(models.Model):
    restaurant = models.ForeignKey(
        Restaurant,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    food_type = models.CharField(max_length=50)
    def __str__(self):
        return self.food_type


class MenuItem(models.Model):
    restaurant = models.ForeignKey(
        Restaurant,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    MenuSection = models.ForeignKey(
        MenuSection,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    food_item = models.CharField(max_length=50)
    def __str__(self):
        return self.food_item

【问题讨论】:

    标签: django django-models foreign-keys


    【解决方案1】:

    您将ForeignKeys 设置为主键。我还没有尝试过,但我想它会将它们变成OneToOneField。尝试从ForeignKey 的定义中删除primary_key=True

    我还注意到你绑定了餐厅两次(在MenuSectionMenuItem)。您只能在MenuSection 中设置餐厅并从MenuItem 访问它,例如menu_item.MenuSection.restaurant.

    【讨论】:

    • 如果我删除primary_key=True,当我尝试访问管理员时会得到no such column: core_menuitem.id
    • 您是否在删除 primary_key 参数后创建了新的迁移和迁移数据库? ./manage.py makemigrations./manage.py migrate。另外不要忘记指定您的环境(python 和 django 版本、数据库)
    • 是的,我做了这些事情,可能是因为存在具有 primary_key=true 的现有对象。它是在说必须为现有模型提供一次性价值
    • 您可能会被添加到数据库中的不可为空的列。这就是为什么它询问一次性价值。似乎您的模型不完整。
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多