python - django.db.utils.IntegrityError:唯一约束失败:first_app_topic.top_name
问题描述
我是一个初学者 Django 用户...
我的 models.py 文件中有这段代码
from django.db import models
# Create your models here.
class Topic(models.Model):
top_name = models.CharField(max_length=264, unique=True)
def __str__(self):
return self.top_name
class Webpage(models.Model):
topic = models.ForeignKey(Topic, on_delete=models.SET_NULL) # added on_delete parameter, because DJANGO > v2.0 is
name = models.CharField(max_length=264, unique=True)
url = models.URLField(unique=True)
def __str__(self):
return self.name
class AccessRecord(models.Model):
name = models.ForeignKey(Webpage, on_delete=models.SET_NULL) # same on_delete needed to be added otherwise t>python manage.py migrate fails
date = models.DateField()
def __str__(self):
return str(self.date)
上面的代码针对 Django 版本 > 2.0(即 on_delete=models.SET_NULL)作为参数进行了更新。
然后我在命令控制台中运行以下命令
python manage.py makemigrations registers the changes to your application.
python manage.py migrate
python manage.py shell
>>> from first_app.models import Topic
>>> print(Topic.objects.all())
<QuerySet [Topic: Social Network]>
>>> t = Topic(top_name="Social Network")
>>> t.save()
这给出了以下错误日志
Traceback (most recent call last):
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\sqlite3\base.py", line 396, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: UNIQUE constraint failed: first_app_topic.top_name
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\base.py", line 746, in save
force_update=force_update, update_fields=update_fields)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\base.py", line 784, in save_base
force_update, using, update_fields,
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\base.py", line 887, in _save_table
results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\base.py", line 926, in _do_insert
using=using, raw=raw,
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\query.py", line 1204, in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\models\sql\compiler.py", line 1392, in execute_sql
cursor.execute(sql, params)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\utils.py", line 100, in execute
return super().execute(sql, params)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\utils.py", line 68, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\utils.py", line 77, in _execute_with_wrappers
return executor(sql, params, many, context)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\utils.py", line 86, in _execute
return self.cursor.execute(sql, params)
File "C:\....\MyDjangoEnv\lib\site-packages\django\db\backends\sqlite3\base.py", line 396, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: UNIQUE constraint failed: first_app_topic.top_name
为什么我会收到这个错误,我需要输入/做什么来修复它,以便它保存?
这是 Udemy 课程“Python 和 Django Fullstack Webdeveloper Bootcamp”的一部分
如果我然后将以下内容添加到 admin.py
from django.contrib import admin
from first_app.models import AccessRecord, Topic, Webpage
# Register your models here.
admin.site.register(AccessRecord)
admin.site.register(Topic)
admin.site.register(Webpage)
然后运行
python manage.py createsuperuser
我明白了
SystemCheckError: System check identified some issues:
ERRORS:
first_app.AccessRecord.name: (fields.E320) Field specifies on_delete=SET_NULL, but cannot be null.
HINT: Set null=True argument on the field, or change the on_delete rule.
first_app.Webpage.topic: (fields.E320) Field specifies on_delete=SET_NULL, but cannot be null.
HINT: Set null=True argument on the field, or change the on_delete rule.
所以我将 on_delete=models.SET_NULL 更改为 on_delete=models.CASCADE
然后重新运行,它给了我
用户名(留空以使用“OneWorld”):
解决方案
正如 Willem Van Onsem 所说,已经存在同名的主题,我认为纠正这个问题的最佳方法是访问 django admin,然后转到同名的主题并更改其名称,或者干脆将其删除。
推荐阅读
- c# - 我想更新一个 num 参数并将其汇总到我的数据库中...遇到问题... Gridview
- ios - 如何在 iOS 中找到生成的 Link Map 文件
- ionic-framework - Ionic 照片库无法在 iOS 设备中加载
- marklogic - 同一路径的多个模板 (MarkLogic)
- java - 'compareTo' 比较用例
- google-apps-script - 从多个时区的电子表格数据创建日历事件时间
- c++ - 通过插槽在 Qt 函数调用中打印/显示某些内容
- javascript - 输入类型中的“保存”值=“隐藏”Chrome 替代品
- spring - Spring属性注入完整的属性对象到bean
- c# - 选择组合框时如何获取数据windows Form c#