python - Django 3.0x 中如何以及为什么会出现外键完整性错误?
问题描述
我正在尝试在 Django 中创建一个待办事项列表应用程序,并且我想将用户的个人资料链接到他自己的待办事项列表、待办事项列表项和一个额外的截止日期类。
我目前正在尝试使用 createsuperuser 创建我的超级用户。但是,我收到一个异常,因为我的外键约束失败了。以下是回溯:
File "manage.py", line 21, in <module>
main()
File "manage.py", line 17, in main
execute_from_command_line(sys.argv)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/core/management/base.py", line 328, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 79, in execute
return super().execute(*args, **options)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/core/management/base.py", line 369, in execute
output = self.handle(*args, **options)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 189, in handle
self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/contrib/auth/models.py", line 158, in create_superuser
return self._create_user(username, email, password, **extra_fields)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/contrib/auth/models.py", line 141, in _create_user
user.save(using=self._db)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 66, in save
super().save(*args, **kwargs)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/base.py", line 746, in save
force_update=force_update, update_fields=update_fields)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/base.py", line 795, in save_base
update_fields=update_fields, raw=raw, using=using,
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 175, in send
for receiver in self._live_receivers(sender)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/dispatch/dispatcher.py", line 175, in <listcomp>
for receiver in self._live_receivers(sender)
File "/Users/ganesh/dev/WebApp/WebApp/users/signals.py", line 10, in create_profile
Profile.objects.create(user=instance)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/query.py", line 433, in create
obj.save(force_insert=True, using=self.db)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/base.py", line 746, in save
force_update=force_update, update_fields=update_fields)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/base.py", line 784, in save_base
force_update, using, update_fields,
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/base.py", line 886, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/base.py", line 925, in _do_insert
using=using, raw=raw,
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/query.py", line 1204, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1377, in execute_sql
cursor.execute(sql, params)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/backends/utils.py", line 100, in execute
return super().execute(sql, params)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/backends/utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/backends/utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/backends/utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "/Users/ganesh/dev/WebApp/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 396, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: FOREIGN KEY constraint failed
这是我的models.py类:
from django.db import models
from django.contrib.auth.models import User
import os
from django.db.models.signals import post_save
import datetime
class ToDoItem(models.Model):
item_name = models.CharField(max_length = 150)
item_type = models.CharField(max_length = 20)
item_desc = models.TextField()
class Meta:
verbose_plural_name = "ToDoItems"
def __str__(self):
return self.item_name
class ToDoList(models.Model):
all_lists = models.TextField()
item = models.ForeignKey(ToDoItem, default = 1, verbose_name = "ToDoItems",on_delete = models.SET_DEFAULT)
class Meta:
verbose_name_plural = "ToDoLists"
def __str__(self):
return self.all_lists
class Deadline(models.Model):
deadline_heading = models.CharField(max_length = 50)
deadline_desc = models.TextField()
deadline_due = models.DateTimeField("Date Due", default =datetime.date.today()+datetime.timedelta(days=7))
class Meta:
verbose_name_plural = "Deadlines"
def __str__(self):
return self.deadline_heading
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
dl = models.ForeignKey(Deadline, default = 1, verbose_name = "Deadlines", on_delete = models.SET_DEFAULT)
col_list = models.ForeignKey(ToDoList, default = 1, verbose_name = "ToDoLists", on_delete = models.SET_DEFAULT)
def __str__(self):
return f'{self.user.username} Profile'
我了解我的代码和数据库之间存在一些差异。但是,我无法准确指出问题所在。有人可以指出我的错误吗?
我也想知道如何克服这个问题,以及将来我能做些什么来避免这样的问题。有什么建议么?
我非常感谢您的帮助。提前非常感谢。
解决方案
您的错误发生在这里:
File "/Users/ganesh/dev/WebApp/WebApp/users/signals.py", line 10, in create_profile
Profile.objects.create(user=instance)
可能是因为 id=1 的 Deadline 或 id=1 的 ToDoList 引用了相关数据库表中不存在的实例。您可以确保在数据库中创建它们。
您还可以从字段定义中删除默认值并添加 null=True:
dl = models.ForeignKey(Deadline, null=True, verbose_name = "Deadlines", on_delete = models.SET_NULL)
col_list = models.ForeignKey(ToDoList, null=True, verbose_name = "ToDoLists", on_delete = models.SET_NULL)
推荐阅读
- typescript - 判别联合上的条件类型
- vue.js - 在 Vue 中 - this.$data.foo 与 this.foo 有什么区别?
- bixby - 通过 Voice for Bixby 捕获街道地址
- ios - Xcode:如何为指向两个不同团队帐户(企业和公司)的两个不同目标选择两个不同的应用程序组
- javascript - 如何编写一个将电话号码作为字符串接收并验证它是否是美国电话号码的函数?
- c# - WPF XAML 文件中的 ObjectDataProvider.ConstructorParameters 疑难解答
- python - 在 pandas 数据框中从“年-月-日”格式中删除年份
- python - python - 将geopandas与python一起使用时如何使形状文件中的线条更粗?
- r - 在 r 中的组条件下从另一个数据帧中找到最接近的对值
- ruby-on-rails - Rails 5 中单个页面上的多个 Ajax 链接