Django Model IntegrityError:NOT NULL约束失败:

时间:2015-05-28 12:19:28

标签: python django

我正在构建一个制作短网址的服务。我有模特:

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

我做错了什么?

2 个答案:

答案 0 :(得分:5)

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试图告诉您,您在url_to_short模型实例上没有提供a关系。

你需要

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

答案 1 :(得分:0)

LongURL 创建条目时,您必须创建 ShortURL 的对象或过滤掉已经存在的对象(因为 ForeignKey 字段不能留空)。此外,您说有时您已经能够实现所需的行为。之所以如此,是因为在那些地方,您会得到一个 ShortURL 对象,而它不是 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 块代替,但我不建议这样做。