2011-06-17 15 views
12

私はUserオブジェクトを使用するものをテストしたかったのです。Django:IntegrityError:カラムuser_idが一意ではありません

しかし、私は取得しています何らかの理由:

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', '[email protected]', '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() 
+0

私はあなたが何とかユーザーの作成をラップし、その信号を取り除くことを試みることができると思います。ラッパーはUserProfileでUserをまだ持っていない場合にそれをフックします。 –

答えて

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

プロファイルモデルでuser_idフィールドに一意制約が設定されているとしますか?

同じUserオブジェクトに関連するプロファイルをコードの他の場所に保存しようとしているようです。 get_or_createデータベースにそのようなオブジェクトが存在しない場合にのみ新しいオブジェクトを作成するため、ショートカットは正常に動作します。それ以外の場合は、既存のオブジェクトを返します。一方、Profile()。save()はオブジェクトの保存を試みるだけで、可能でない場合は例外を送出します。

あなたにとって理にかなっていますか?

4

同じ問題が発生しましたが、簡単な修正があります。この問題は、 'manage.py dumpdata'を実行し、データベースにUserProfileがすでに存在する場合に発生します。 UserProfileはjsonファイルにあります。テストデータフィクスチャを読み込み、テストで同じユーザ名を持つ新しいUserProfileを作成しようとすると、そのUserを持つUserProfileがすでに存在するため、競合が発生します。解決方法は、json fixtureからUserProfileを削除することです。だから、

、例として:

  • あなたはユーザ名「マシュー」でユーザーと既存のデータベースを持っているとのUserProfileはユーザー
  • は、あなたがた今manage.py dumpdataの
  • を実行することを縛らjson fixtureには、あなたのアプリケーションのモデルの一部であるため(ユーザーではない)、ユーザープロファイルがあります。
  • これで、テストでユーザーを作成しようとしました: 'User.objects.create_user' 'mathew'、 'マシュー@例。comの「 『パスワード』)」
  • あなたの投稿は、信号を保存引き金とユーザーに関連付けられているのUserProfileを作成しようとします 『マシュー』
  • しかしのUserProfileがすでに存在していることと、あなたがエラーに

希望を取得それは助ける。

+0

これは私のために解決されました: './manage.py dumpdata -e authtoken.token> mydump.json' –

関連する問題