Am definit un extra UserProfile
pentru a extinde User
ca
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.
- perfect rezolvat problema mea, ați putea vă rog să transmiteți comiterea scurtă pentru a răspunde. @KevinChristopherHenry. > Por AbstProcDo.
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.
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)
Î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]