django - usuarios - cómo definir un perfil de usuario en UserDetialsSerializer?
modelo de usuarios django (2)
Deseo poder acceder a una instancia de userprofile
través de:
profile = instance.userprofile
statement en UserSerializer
instance
se crea a través de:
instance = super(UserSerializer, self).update(instance, validated_data)
en UserSerializer
Como UserSerializer
hereda UserDetailsSerializer
, creo que debería definir un userprofile
de UserDetailsSerializer
en UserDetailsSerializer
.
Pero no sé cómo hacerlo?
Pregunta: ¿Cómo definir userprofile
en UserDetailsSerializer
para lograr lo anterior?
UserSerializer:
class UserSerializer(UserDetailsSerializer):
company_name = serializers.CharField(source="userprofile.company_name")
class Meta(UserDetailsSerializer.Meta):
fields = UserDetailsSerializer.Meta.fields + (''company_name'',)
def update(self, instance, validated_data):
profile_data = validated_data.pop(''userprofile'', {})
company_name = profile_data.get(''company_name'')
instance = super(UserSerializer, self).update(instance, validated_data)
# get and update user profile
profile = instance.userprofile
if profile_data and company_name:
profile.company_name = company_name
profile.save()
return instance
UserDetailsSerializer:
class UserDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = (''username'',''email'', ''first_name'', ''last_name'')
read_only_fields = (''email'', )
Modelo de perfil de usuario :
class UserProfile(models.Model):
user = models.OneToOneField(User)
# custom fields for user
company_name = models.CharField(max_length=100)
¿Pregunta si se requiere más claridad?
Creo que he respondido uno similar aquí
En la documentación , se supone que userprofile ya se creó y ahora se puede actualizar. Solo necesitas un cheque
# get and update user profile
try:
profile = instance.userprofile
except UserProfile.DoesNotExist:
profile = UserProfile()
if profile_data and company_name:
Creo que quieres que un campo de método de serialización sea parte de tu serializador. (No entiendo completamente tu pregunta);
class UserDetailsSerializer(serializers.ModelSerializer):
user_related = serializers.Field(source=''method_on_userprofile'')
class Meta:
model = UserProfile
fields = (''username'',''email'', ''first_name'', ''user_related'', )
read_only_fields = (''email'', ''user_related'',)