IntegrityError: Constrângerea UNIQUE a eșuat: user_userprofile.user_id (Programare, Django)

AbstProcDo a intrebat.

Am definit un extra UserProfile pentru a extinde Userca

class UserProfile(models.Model):
    SEX = (
        (1, 'male'),
        (0, 'woman'),
    )
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    sex = models.IntegerField(choices=SEX, default=1)
    location = models.CharField(max_length=30)
    about_me = models.TextField()

Când adaug UserProfile la User existent în Django shell

In[19]: for u in User.objects.all():
    ...:     profile = UserProfile(user=u)
    ...:     profile.save()

se raportează o eroare:

IntegrityError: UNIQUE constraint failed: user_userprofile.user_id

Am verificat răspunsul Django: Eroare de integritate UNIQUE constraint failed: user_profile.user_id – Stack Overflow, dar nu am nicio idee pentru a-mi rezolva problema.

Comentarii

  • perfect rezolvat problema mea, ați putea vă rog să transmiteți comiterea scurtă pentru a răspunde. @KevinChristopherHenry.  > Por AbstProcDo.
3 răspunsuri
Kevin Christopher Henry

A OneToOneField înseamnă că fiecare User poate avea doar un singur UserProfile. Din moment ce faci o buclă peste fiecare User, va eșua – adică va încălca constrângerea unică a bazei de date care definește OneToOneField-dacă există orice UserProfiles.

Un mod simplu de a verifica acest lucru este să vă uitați la UserProfile.objects.count(). Dacă răspunsul la această întrebare nu este 0, , atunci, prin definiție, veți obține că IntegrityError atunci când executați bucla.

JPG

Acest lucru este destul de simplu, ați definit un OneToOne relație între User și UserProfile, ceea ce înseamnă că, doar o singură User este asociat cu unul și numai unul UserProfile.

Nu sunt sigur de logica dumneavoastră, dar încercați oricum următoarele


for user in User.objects.all():
    if hasattr(user,'userprofile') and not user.userprofile:
        UserProfile.objects.create(user=user)

Nicholas Claude LeBlanc

Îmi place răspunsul lui Jerin Peter George, deoarece nu face o lovitură în baza de date, totuși, dacă aveți nevoie de acces la instanța profilului utilizatorului în timp ce iterați prin acest proces, puteți utiliza, de asemenea, metoda get_or_create încorporată, legată de managerul modelului. . adică.

for u in User.objects.all():
    instance, created = UserProfile.objects.get_or_create(
        user=u, 
        defaults={#list of default keys and values})
    if created: 
        #update profile with form or other external data?
    else:
        #do other stuff 
    instance.save()

De asemenea, ați putea verifica numărul setului de întrebări

user_profiles = UserProfile.objects.filter(user=u)
instance = None
if user_profiles.count() is 0:
    # user profile doesn't exist create one
    instance = UserProfile.objects.create(user=u)
else:
    # user profile exists
    instance = user_profiles[0]

Tags: