python - django.db.utils.IntegrityError : (1062, "Duplicate entry for user_id")

标签 python mysql django

我有一个特定的模型:

class Problem(models.Model):

    title = models.CharField(max_length=80)
    problem_text = models.TextField(max_length=5000)
    pub_date = models.DateTimeField(default=timezone.now)
    votes = models.IntegerField(default=0)
    wiki_answer = models.TextField(max_length=5000, null=False, default='', blank=True)
    topic = models.CharField(max_length=50, blank=False)
    position = models.CharField(max_length=50, null=True, blank=False)
    user = models.OneToOneField(User, null=True, blank=False, unique=False)

并且在添加一个用户写的多个帖子后,即使用户不应该是唯一的,Django 也会引发错误。这是完整的堆栈跟踪:

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/backends/mysql/base.py" in execute
  112.             return self.cursor.execute(query, args)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in execute
  226.             self.errorhandler(self, exc, value)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/connections.py" in defaulterrorhandler
  36.         raise errorvalue

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in execute
  217.             res = self._query(query)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in _query
  378.         rowcount = self._do_query(q)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in _do_query
  341.         db.query(q)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/connections.py" in query
  280.             _mysql.connection.query(self, query)

The above exception ((1062, "Duplicate entry '1' for key 'interview_questions_problem_user_id_105dd8d0_uniq'")) was the direct cause of the following exception:

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/views/generic/base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "/Users/artemdremov/Documents/python/interview_project/interview_questions/views.py" in post
  55.             post.save()

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/base.py" in save
  708.                        force_update=force_update, update_fields=update_fields)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/base.py" in save_base
  736.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/base.py" in _save_table
  820.             result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/base.py" in _do_insert
  859.                                using=using, raw=raw)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/manager.py" in manager_method
  122.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/query.py" in _insert
  1039.         return query.get_compiler(using=using).execute_sql(return_id)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/models/sql/compiler.py" in execute_sql
  1060.                 cursor.execute(sql, params)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/backends/utils.py" in execute
  79.             return super(CursorDebugWrapper, self).execute(sql, params)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/utils.py" in __exit__
  95.                 six.reraise(dj_exc_type, dj_exc_value, traceback)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/utils/six.py" in reraise
  685.             raise value.with_traceback(tb)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/django/db/backends/mysql/base.py" in execute
  112.             return self.cursor.execute(query, args)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in execute
  226.             self.errorhandler(self, exc, value)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/connections.py" in defaulterrorhandler
  36.         raise errorvalue

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in execute
  217.             res = self._query(query)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in _query
  378.         rowcount = self._do_query(q)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/cursors.py" in _do_query
  341.         db.query(q)

File "/Users/artemdremov/Documents/python/interview_project/venv/interview_project/lib/python3.4/site-packages/mysqlclient-1.3.7-py3.4-macosx-10.6-intel.egg/MySQLdb/connections.py" in query
  280.             _mysql.connection.query(self, query)

Exception Type: IntegrityError at /p/add/
Exception Value: (1062, "Duplicate entry '1' for key 'interview_questions_problem_user_id_105dd8d0_uniq'")

Django 版本 1.9.5。

这是添加帖子表单的 View :

class AddView(View):
    template_name = 'interview_questions/add.html'
    form_class = ProblemForm
    success_url = '/'

    # display blank form
    def get(self, request):
        if request.user.is_authenticated():
            form = self.form_class(None)
            return render(request, self.template_name, {'form': form, 'user': request.user})
        else:
            return redirect('interview_questions:index')

    # process data
    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid() and request.user.is_authenticated():
            post = form.save(commit=False)
            post.pub_date = timezone.now()
            post.user = request.user
            post.save()
            return redirect('interview_questions:index')

        return render(request, self.template_name, {'form': form, 'user': request.user})

最佳答案

错误发生在这里:

"/Users/artemdremov/Documents/python/interview_project/interview_questions/views.py" in post
  55.             post.save()

那是因为你的模型中有这个。

user = models.OneToOneField(User, null=True, blank=False, unique=False)

unique=False 在这里没有效果,因为这里只能有一个条目。

OneToOneField

A one-to-one relationship. Conceptually, this is similar to a ForeignKey with unique=True, but the “reverse” side of the relation will directly return a single object.

三种解决方案

  1. 将您的 OneToOneField 更改为外键
  2. 在您的表单验证中确保记录不存在
  3. 创建表单时检查条目是否已存在,然后允许用户对其进行编辑。

关于python - django.db.utils.IntegrityError : (1062, "Duplicate entry for user_id"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38015891/

相关文章:

Python 2.7.1 : Inconsistent output from os. 路径.isdir()

mysql - 连接 Sql 列

python - numpy 在几个大型数组上出现内存错误

python - VS Code任务和Python虚拟环境

MySQL 到 SQL Server 迁移

mysql - 这个 SELECT FROM WHERE ORDER BY mysql 语法有什么问题?

python - 查看 Python (Django) 中的当前日志记录配置

Python、Django - 在 settings.py 中访问环境变量

python - self.assertTrue(False) 到底测试了什么

python - 文件名字符串到整数错误