繁体   English   中英

Django:IntegrityError:列user_id不是唯一的

[英]Django: IntegrityError: column user_id is not unique

我想测试使用User对象的东西。

但由于某些原因,我得到:

IntegrityError: column user_id is not unique

我一直在撞墙一段时间,似乎我无法弄清楚出了什么问题。 起初我以为可能数据库没有在测试之间刷新,但是我跟踪了User.objects.all()并且它是一个空列表。

这是测试:

from django.contrib.auth.models import User
from django.test import TestCase

class TestSomething(TestCase):
    def test_create_user(self):
        User.objects.create_user('foo', 'foo@bar', 'bar')

我的测试设置:

from settings import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': ':memory:',
    }
}

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

更新:

我应该更好地阅读我的strack痕迹。 它实际上是导致问题的以下信号。

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile(user=instance).save()

我通过调整我的信号解决了这个问题:

from django.dispatch import receiver

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.get_or_create(user=instance)

这解决了症状,但不是真正的原因。 我认为将正常测试与Django测试混合会在某处导致错误。 当我单独在我的问题中运行测试时,它会起作用。

如果我没有得到其他答案,我会将此标记为正确。

我遇到了同样的问题,有一个简单的解决方法。 如果运行'manage.py dumpdata'并且数据库中已有UserProfile,则会出现此问题。 UserProfile将位于json文件中,因此当您加载测试数据夹并尝试在测试中使用相同的用户名创建新的UserProfile时,您将收到冲突,因为已存在与该用户的UserProfile。 解决方案是从json fixture中删除UserProfile。

所以,作为一个例子:

  • 您有一个现有的数据库,其用户名为'mathew',UserProfile与该用户相关联
  • 您运行manage.py dumpdata
  • 现在生成的json fixture中有UserProfile,因为它是应用程序模型的一部分(但不是用户)
  • 现在,您尝试在测试中创建一个用户,如下所示:'User.objects.create_user('mathew','mathew @ example.com','password')'
  • 您的帖子保存信号将触发并尝试创建与用户'mathew'关联的UserProfile
  • 但是UserProfile已经存在,因此您收到错误

希望有所帮助。

我想你在Profile模型中得到了具有唯一约束的user_id字段,不是吗?

您似乎正在尝试在代码中的其他位置保存与相同User对象相关的Profile。 get_or_create快捷方式工作正常,因为只有在数据库中没有这样的对象时才会创建新对象。 否则返回现有对象。 另一方面,Profile()。save()只是尝试保存对象,如果不可能则引发异常。

这对你有意义吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM