Django: IntegrityError: столбец user_id не является уникальным - PullRequest
13 голосов
/ 17 июня 2011

Я хотел протестировать что-то, что использует объекты 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'

Обновление:

Я должен прочитатьмой след немного лучше.Это на самом деле следующий сигнал, который вызывает проблему.

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

Ответы [ 3 ]

6 голосов
/ 17 июня 2011

Я обошел проблему, настроив свой сигнал следующим образом:

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 где-то вызывает ошибку.Когда я запустил тест в одном своем вопросе, это сработало.

Если я не получу других ответов, я отмечу этот как правильный.

4 голосов
/ 07 апреля 2012

Я столкнулся с той же проблемой, и есть простое решение. Проблема возникает, если вы запускаете файл manage.py dumpdata и в вашей базе данных уже есть UserProfile. UserProfile будет находиться в файле json, поэтому, когда вы загружаете тестовый набор данных и пытаетесь создать новый UserProfile с тем же именем пользователя в своем тесте, вы получите конфликт, поскольку UserProfile с этим пользователем уже существует. Решение состоит в том, чтобы просто удалить UserProfile из устройства json.

Итак, в качестве примера:

  • У вас есть база данных с пользователем с именем пользователя 'mathew' и UserProfile, привязанным к этому пользователю
  • Вы запускаете manage.py dumpdata
  • Теперь в полученном устройстве json есть UserProfile, потому что он является частью моделей вашего приложения (но не пользователя)
  • Теперь вы пытаетесь создать пользователя в своем тесте следующим образом: 'User.objects.create_user (' mathew ',' mathew@example.com ',' password ')'
  • Ваш сигнал сохранения после записи сработает и попытается создать UserProfile, связанный с пользователем 'mathew'
  • Но этот UserProfile уже существует, и вы получаете сообщение об ошибке

Надеюсь, это поможет.

1 голос
/ 17 июня 2011

Полагаю, у вас есть user_id поле с уникальным ограничением в модели профиля, не так ли?

Похоже, вы пытаетесь сохранить профиль, связанный с тем же объектом User, в каком-то другом месте вашего кода.get_or_create Ярлык работает нормально, потому что он создает новый объект, только если такого объекта нет в базе данных.В противном случае он возвращает существующий объект.С другой стороны, Profile (). Save () просто пытается сохранить объект и вызывает исключение, если это невозможно.

Имеет ли это смысл для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...