RelatedObjectDoesNotExist в / rest-auth / user /: у пользователя нет профиля пользователя - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь обновить UserDetailsSerializer, и проблема в том, что когда я запускаю свой код в моей тестовой модели, он работает, но когда я использую его в моем реальном приложении, он выдает эту ошибку: объект «Пользователь» не имеет атрибута «userprofile»

model.py

class userProfileModel(models.Model):

GENDER = [
    ('', ""),
    ('M', "Male"),
    ('F', "Female")
]

   user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofile', default='')
   avatar = models.ImageField(upload_to='avatar/', default='avatar/no-avatar.png')
   age = models.DateField(auto_now_add=True)
   gender = models.CharField(max_length=10, choices=GENDER, default='')
   address = models.CharField(max_length=500, default='')
   longitude = models.FloatField(default=0.0)
   latitude = models.FloatField(default=0.0)
   phone = models.IntegerField(default=0)
   user_is_active = models.BooleanField(default=False)

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

serializers.py

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = userProfileModel
        fields = (
            'id',
            'avatar',
            'age',
            'gender',
            'address',
            'longitude',
            'latitude',
            'phone',
        )

class UserDetailsSerializer(UserDetailsSerializer):
    profile = UserProfileSerializer(source='userprofile')
    class Meta(UserDetailsSerializer.Meta):
        fields = UserDetailsSerializer.Meta.fields + ('profile',)
        read_only_fields = ('',)

    def update(self, instance, validated_data):
        # User data
        nested_serializer = self.fields['profile']
        nested_instance = instance.userprofile
        nested_data = validated_data.pop('userprofile')
        nested_serializer.update(nested_instance, nested_data)
        return super(UserDetailsSerializer, self).update(instance, validated_data)

Ошибка:

RelatedObjectDoesNotExist в / rest-auth / user /

У пользователя нет профиля пользователя.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Когда вы создаете профиль пользователя, убедитесь, что вы сохранили его, вы можете сослаться на этот фрагмент.

class Profile(models.Model):
    # ...

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

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
     instance.profile.save()

А также не забудьте импортировать post_save.

0 голосов
/ 22 декабря 2018

Это потому, что UserProfile экземпляр для пользователя еще не создан.Вы можете использовать сигнал на post_save модели User, чтобы при каждом сохранении пользователя проверялось, создан ли для него экземпляр UserProfile, если нет, то создайте его.как показано ниже:

def create_profile(sender,**kwargs ):
    if kwargs['created']:
        user_profile=UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile,sender=User)

Также, как мой друг предложил в комментариях, всегда проверяйте, существует ли экземпляр userProfile с hasattr(instance, 'profile'), если нет, то создайте для него пользователя по умолчанию.

Ссылка: Это крутая тема Расширение модели пользователя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...