2016-09-11 3 views
1

Immer wenn ich versuche, einen Benutzer über das Admin-Panel zu erstellen, erhalte ich diesen Fehler. Ich habe keine Ahnung warum. Aber wenn ich es durch user = User.objects.create_user('aegon', '[email protected]', 'hehehe123') mache, wird es gut funktionieren. Irgendwelche Hinweise darauf, was das verursacht?1062, "Doppelter Eintrag '3' für Schlüssel 'user_id'"

Es gibt nur einen Benutzer in auth_user in meiner Datenbank.

enter image description here

Fehler:

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

meine Modelle:

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

Der Grund ist wahrscheinlich mit post_save Signalcode. Kannst du es kommentieren und überprüfen - ist der Fehler weg? – Nevertheless

Antwort

3

Wahrscheinlich ein Duplikat-Signal:

Die Quelle des Fehlers ist tatsächlich im UserProfile Modell , nicht die User selbst. Ausnahmemeldung besagt, dass user_id (das ist ein Verweis auf User Modell aus UserProfile) doppelt wird, so entweder Datensatz für User mit bereits in der Tabelle vorhanden ist, oder post_save Signal zweimal ausgelöst wird.

Aus dem Django docs 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.

Die Lösung lautet:

# 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") 

Das Ihrem Signal eindeutige ID geben und verhindert, dass es mehrere Male von dem Brennen.

Wenn das nicht hilft:

Manchmal müssen Sie explizit Primärschlüssel für eine OneToOne Beziehung gesetzt:

dass das Standard-Primärschlüssel Verhalten außer Kraft setzen, und wird nicht produzieren eine Ausnahme.

+0

Danke das hat den Trick gemacht. :) – vandelay

+0

Signale 'dispatch_uid' oder' primary_key = True'? – Nevertheless

+1

primary_key = True für mich gelöst. – Tommaso

Verwandte Themen