Django:IntegrityError:列user_id不是唯一的

Pic*_*els 13 python django

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

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

IntegrityError: column user_id is not unique
Run Code Online (Sandbox Code Playgroud)

我一直在撞墙一段时间,似乎我无法弄清楚出了什么问题.起初我以为可能数据库没有在测试之间刷新,但是我跟踪了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')
Run Code Online (Sandbox Code Playgroud)

我的测试设置:

from settings import *

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

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

Pic*_*els 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)
Run Code Online (Sandbox Code Playgroud)

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

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


mat*_*hew 5

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

所以,作为一个例子:

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

希望有帮助。