繁体   English   中英

Django 模型 IntegrityError:NOT NULL 约束失败:

[英]Django Model IntegrityError: NOT NULL constraint failed:

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

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

我做错了什么?

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

根据您的设置方式, url_to_short外键不是 optional 因此,当您尝试保存时:

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

Django是想告诉你,你没有提供url_to_short上你们的关系a模型实例。

你需要要么

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

在为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块来代替,但我不建议这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM