【问题标题】:Django Model IntegrityError: NOT NULL constraint failed:Django 模型完整性错误:NOT NULL 约束失败:
【发布时间】:2015-08-10 22:51:34
【问题描述】:

我正在构建一个生成短 URL 的服务。我有模型:

from django.db import models

class ShortURL(models.Model):
    url = models.CharField(max_length = 50)

class LongURL(models.Model):
    name = models.CharField(max_length = 100, null=True)
    url_to_short = models.ForeignKey(ShortURL)

我已经运行了命令:python manage.py migrate 如果我打开解释器,使用python manage.py shell 并运行以下代码:

>>> from appshort.models import LongURL
>>> a = LongURL(name = 'hello_long_link')
>>> a.save()

然后我得到错误:

django.db.utils.IntegrityError: NOT NULL constraint failed: appshort_longurl.url_to_short_id

我做错了什么?

【问题讨论】:

  • url_to_short 您的模型需要 FK 字段,但您忘记填写了。
  • 您创建了一个LongURL 而不给它一个ShortURL,这是一个错误。如果这是一个有效的情况,请按照此处所述将 ShortURL 字段设为可选:stackoverflow.com/questions/6619984/…

标签: python django


【解决方案1】:
class LongURL(models.Model):
    name = models.CharField(max_length = 100, null=True)
    url_to_short = models.ForeignKey(ShortURL)

按照您的设置方式,url_to_short 外键不是可选的。所以当你尝试保存时:

>>> a = LongURL(name = 'hello_long_link')
>>> a.save()

Django 试图告诉你你没有在你的a 模型实例上提供url_to_short 关系。

你需要

  • 在创建 LongURL 实例时提供 ShortURL 关系
  • 使用null=True, blank=True 使url_to_short 关系可选。

【讨论】:

  • 这特别令人困惑,因为我有另一个例子,default=None 在相同的情况下工作,但现在看来null=True, blank=True 是必需的(?)。
【解决方案2】:

在为LongURL 创建条目时,您必须创建ShortURL 的对象或过滤掉已经存在的对象(因为ForeignKey 字段不能留空)。此外,您说有时您已经能够实现所需的行为。之所以会这样,是因为在那些地方你会得到一个ShortURL 的对象,它是not null。但是,当您在创建LongURL 期间尝试发送空对象时,就会出现讨论中的错误。例如:

...
short_url_obj = ShortURL.objects.filter(...).first()
# you have to ensure that this above query is not null
try: 
    new_long_url = LongURL(url_to_short=short_url_obj, name="some_name")
    new_long_url.save()

except:
    # if the short_url_obj is null
    print("The short_url_obj was null, cannot save to database")

...

也可以使用if-else 块代替,但我不建议这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多