首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django.db.utils.IntegrityError:唯一约束失败: first_app_topic.top_name

django.db.utils.IntegrityError:唯一约束失败: first_app_topic.top_name
EN

Stack Overflow用户
提问于 2020-06-20 02:18:47
回答 1查看 190关注 0票数 0

我是Django的初学者。

我的models.py文件中有以下代码

代码语言:javascript
复制
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)的参数进行更新的。

然后,我在命令控制台中运行以下命令

代码语言:javascript
复制
python manage.py makemigrations registers the changes to your application.
python manage.py migrate
python manage.py shell
代码语言:javascript
复制
>>> from first_app.models import Topic
>>> print(Topic.objects.all())
<QuerySet [Topic: Social Network]>
>>> t = Topic(top_name="Social Network")
>>> t.save()

这将提供以下错误日志

代码语言:javascript
复制
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训练营“的一部分。

如果我随后将以下代码添加到admin.py

代码语言:javascript
复制
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)

然后运行

代码语言:javascript
复制
python manage.py createsuperuser

我得到了

代码语言:javascript
复制
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'):

EN

回答 1

Stack Overflow用户

发布于 2020-06-20 06:35:35

正如Willem Van Onsem所说,具有该名称的主题已经存在,我认为纠正此问题的最好方法是访问django admin,然后转到具有相同名称的主题并更改其名称,或者干脆将其删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62476338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档