Nella mia applicazione, voglio creare voci in certe tabelle quando un nuovo utente si iscrive. Ad esempio, voglio creare un profilo utente che faccia riferimento alla loro azienda e ad altri record per loro. Ho implementato questo con un segnale post_save:Come posso evitare che le apparecchiature siano in conflitto con il codice segnale post_save di django?
def callback_create_profile(sender, **kwargs):
# check if we are creating a new User
if kwargs.get('created', True):
user = kwargs.get('instance')
company = Company.objects.create(name="My Company")
employee = Employee.objects.create(company=company, name_first=user.first_name, name_last=user.last_name)
profile = UserProfile.objects.create(user=user, employee=employee, partner=partner)
# Register the callback
post_save.connect(callback_create_profile, sender=User, dispatch_uid="core.models")
Questo funziona bene quando viene eseguito. Posso usare l'amministratore per creare un nuovo utente e anche le altre tre tabelle ottengono le voci con ragionevolezza. (Tranne che, il dipendente dal momento che user.first_name e user.last_name non sono compilati nel modulo di amministrazione quando salva. Non riesco ancora a capire perché sia fatto così)
Il problema è venuto quando Ho eseguito la mia suite di test. Prima di questo, avevo creato una serie di proiettori per creare queste voci nelle tabelle. Ora ottengo un errore che afferma:
IntegrityError: duplicate key value violates unique constraint "core_userprofile_user_id_key"
Penso che questo sia perché ho già creato un record aziendali, dei dipendenti e di profilo nel dispositivo con ID "1" e ora il segnale post_save sta cercando di ricrearlo.
I miei regali sono: posso disabilitare questo segnale post_save durante l'esecuzione di dispositivi? Posso rilevare che sono in esecuzione come parte della suite di test e non creare questi record? Dovrei cancellare questi record dalle fixture ora (anche se il segnale imposta solo i valori di default non i valori che voglio testare)? Perché il codice di caricamento del dispositivo non sovrascrive solo i record creati?
Come fanno le persone?
+1. Non lo sapevo. Lo terremo a mente. –
2 anni dopo, questo è il modo migliore che ho trovato per gestire questo. Dovevo farlo per il modello di profilo utente personalizzato (AUTH_PROFILE_MODULE) dove avrebbe creato un piccolo elenco di utenti predefiniti dalla mia app. Ho semplicemente controllato all'interno del mio segnale personalizzato se 'raw' in kwargs. – Jordan
Ottima soluzione! Mi hai risparmiato un sacco di mal di testa stamattina. Per semplificare un po ', si potrebbe usare l'argomento named 'created' e rimuovere le parentesi ridondanti: ' 'se creato e non kwargs.get (' raw ', False):' ' –