मैं एक उपयोगकर्ता और एक प्रोफ़ाइल को django में सहेजने का प्रयास कर रहा हूं जो oneToOneField का उपयोग करके एक साथ जुड़े हुए हैं लेकिन मुझे यह कहते हुए एक त्रुटि हो रही है

डुप्लिकेट कुंजी मान अद्वितीय बाधा का उल्लंघन करता है "auth_user_username_key

हालांकि मेरे पास कोई डुप्लीकेट नहीं है।

मुझे यह त्रुटि भी मिलती है:

डुप्लिकेट कुंजी मान अद्वितीय बाधा "api_profile_user_id_key" का उल्लंघन करता है विवरण: कुंजी (user_id)=(9) पहले से मौजूद है।

यहाँ मेरा कोड है:

model.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models import CharField, OneToOneField
from django.db.models.signals import post_save
from django.dispatch import receiver


class Profile(models.Model):
    user = OneToOneField(User, on_delete=models.CASCADE)
    phone_number = CharField(max_length=20)
    account_type = CharField(max_length=10, default='basic')
    facebook_id = CharField(max_length=20, blank=True)
    google_id = CharField(max_length=20, blank=True)
    notification_id = CharField(max_length=40, blank=True)
    # TODO add account info and watchlist

    def __str__(self):
        return self.user.email


@receiver(post_save, sender=User)
def user_save(sender, instance, **kwargs):
    Profile.objects.create(user=instance)

view.py:

@api_view(['POST'])
def sign_up(request):
    data = request.data
    user = User.objects.create_user(username=data['username'],
                                    password=data['password'],
                                    first_name=data['first_name'],
                                    last_name=data['last_name'],
                                    email=data['email']
                                    )
    user.profile.phone_number = data['phone_number']
    user.save()
    return Response('hey')

मुझे लगता है कि समस्या post_save रिसीवर में है हालांकि मुझे यकीन नहीं है।

1
ninesalt 8 नवम्बर 2019, 21:56

1 उत्तर

सबसे बढ़िया उत्तर

create_user सेव () भी कॉल कर रहा है, तो आप user.save() भी कॉल करते हैं, एक उपयोगकर्ता के लिए पोस्ट_सेव सिग्नल को दो बार कॉल किया जा रहा है, आपको त्रुटि मिलती है क्योंकि एक उपयोगकर्ता के लिए दो प्रोफ़ाइल ऑब्जेक्ट बनाए जा रहे हैं

तुम यह कर सकते थे:

@receiver(post_save, sender=User)
def user_save(sender, instance, **kwargs):
    Profile.objects.get_or_create(user=instance)
2
Yellowduck 8 नवम्बर 2019, 22:08