2016-09-11 41 views
1

管理パネルからユーザーを作成しようとすると、このエラーが発生します。なぜか分からない。しかし、もし私がuser = User.objects.create_user('aegon', '[email protected]', 'hehehe123')でそれを行うとうまくいくでしょう。これを引き起こしていることへのヒント?1062 "キー 'user_id'の重複エントリ '3'

データベース内のauth_userには1人のユーザーしかいません。

enter image description here

エラー:

django.db.utils.IntegrityError: (1062, "Duplicate entry '3' for key 'user_id'") 

私のモデル:おそらく

class transaction(models.Model): 
    amount = models.IntegerField() 
    holding = models.ForeignKey(holding, on_delete=models.CASCADE) 
    user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True) 

    def __str__(self): 
     return "amount: " + str(self.amount) + " - ip : " + str(self.holding.name) + " - user: " + str(self.user.username) 

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    ip = models.IntegerField(default=0) 
    ingameName = models.CharField(max_length=50, default='NotSet')  
    userprofit = models.IntegerField(default=0) 

    user_transactions = models.ForeignKey(transaction, on_delete=models.CASCADE, blank=True, null=True) 

def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     UserProfile.objects.create(user=instance) 

post_save.connect(create_user_profile, sender=User) 
+0

おそらくpost_save信号コードが原因です。コメントして確認できますか?エラーはなくなりましたか? – Nevertheless

答えて

3

重複信号:

エラーの原因がUserProfileモデルに実際にあります、 User自体ではありません。例外メッセージには、Userモデル(UserProfileのモデル)への参照が複製されているため、Userid = 3のレコードが既に存在しているか、post_saveシグナルが2回発生しています。 Djangoのドキュメントhereから

In some circumstances, the code connecting receivers to signals may run multiple times. This can cause your receiver function to be registered more than once, and thus called multiples times for a single signal event.

ソリューションです:あなたの信号に一意のIDを与え、複数回発射するのを防ぐことができます

# Change 'name_your signal' to desired unique signal name within your app 
post_save.connect(create_user_profile, sender=User, dispatch_uid="name_your signal") 

それでも解決しない場合は、次の

デフォルトの主キーの動作をオーバーライドし、生成されません。

時には明示的OneToOne関係の主キーを設定する必要があります例外。

+0

ありがとう、トリックでした。 :) – vandelay

+0

信号 'dispatch_uid'または' primary_key = True'? – Nevertheless

+1

primary_key = Trueは私のために解決されました。 – Tommaso

関連する問題