【问题标题】:Django ForeignKey value does not have corresponding valueDjango ForeignKey 值没有对应的值
【发布时间】:2020-07-24 20:49:59
【问题描述】:

我正在使用模式“ForeignKey”部分的视频中的 30 分钟左右制作 CS50 的 Django 部分。

当我运行 make 迁移时,我得到了错误。

您正在尝试在没有默认值的情况下向产品添加不可为空的字段“代理”;我们不能这样做(数据库需要一些东西来填充现有的行)。

请选择一个修复:

1) 现在提供一次性默认值(将在所有现有行上设置此列的空值)

2) 退出,让我在 models.py 中添加一个默认值

选择一个选项:2

如果我将默认值设置为字符串值,我会收到错误消息,说它需要一个 id。

如果我将其设置为 1,那么我会得到以下结果。

主键为“1”的表“clutter_product”中的行具有无效的外键:clutter_product.agent_id 包含的值“1”在 clutter_supplier.id 中没有对应的值。

class Supplier(models.Model):
company = models.CharField(max_length=64)
contact = models.CharField(max_length=64)
email = models.CharField(max_length=128, blank = True)

def __str__(self):
    return f"{self.id} {self.company} {self.contact} {self.email}"

class Product(models.Model):
    name = models.CharField(max_length=64)
    sku = models.CharField(max_length=64, blank = True)
    unit_cost = models.IntegerField()
    rrp = models.IntegerField()
    average_fee = models.IntegerField()
    shipping_fee = models.IntegerField()
    agent = models.ForeignKey(Supplier, default=1, on_delete=models.CASCADE, related_name="suppliers")

【问题讨论】:

    标签: django foreign-keys cs50


    【解决方案1】:

    我建议尝试以下步骤:

    首先,删除导致此问题的迁移文件。

    第二次像这样改变模型:

    class Product(models.Model):
        # rest of the fields
        agent = models.ForeignKey(Supplier, null=True, default=None, on_delete=models.CASCADE, related_name="suppliers")
    

    第三次运行 makemigrations 并迁移。

    第四使用supplier = Supplier.objects.create(company="ABC", contact="contact", email="a@b.c", pk=1)创建供应商实例

    第五(可选)更新现有产品以拥有供应商-Product.objects.update(agent=supplier)

    第六,如果您想限制使用代理创建产品,则从Product 模型中的agent 字段中删除null=True, default=None。然后运行 ​​makemigrations 并迁移。

    【讨论】:

    • 谢谢 null=True,default=None,正是我所需要的。
    • 如果还设置了null=True,是否还需要指定default=None?我相信设置null=True 会使default=None 变得多余。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2021-02-26
    • 2016-12-07
    • 2013-02-14
    相关资源
    最近更新 更多