Django:IntegrityError:列user_id不是唯一的

时间:2011-06-17 15:29:01

标签: python django

我想测试一些使用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()

3 个答案:

答案 0 :(得分:6)

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

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测试混合会在某处导致错误。当我单独在我的问题中运行测试时,它会起作用。

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

答案 1 :(得分:4)

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

所以,举个例子:

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

希望有所帮助。

答案 2 :(得分:1)

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

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

对你有意义吗?