我正在构建一个制作短网址的服务。我有模特:
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
我做错了什么?
答案 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
实例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
块代替,但我不建议这样做。