2016-10-23 2 views
0

У меня есть две модели CustomUser и UserProfile.Как объединить поля двух разных моделей и создать ModelSerializer

class CustomUser(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(_('email address'), max_length=254, unique=True, blank=True) 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 

class UserProfile(models.Model): 
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE) 
    owner_of = models.CharField(max_length=100, blank=True) 
    total_years= models.CharField(_('In Current Profession Since'),max_length=100,blank=True, null=True) 

serializers.py:

class AccountSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = CustomUser 
     fields = ('id', 'email','first_name', 'last_name',) 

class ProfileSerializer(serializers.ModelSerializer): 
    user = AccountSerializer(read_only=True,required=False) 
    class Meta: 
     model = UserProfile 
     fields = ('user','owner_of','total_years','first_name','last_name','email') 

Ошибка я получаю "Имя поля first_name не действует для модели UserProfile."

Как совместить две модели поля и сделать создание и обновление функции

ответ

1

Ваш profileserializer должен быть таким,

class ProfileSerializer(serializers.ModelSerializer): 
    user = AccountSerializer(required=True) 
    class Meta: 
     model = UserProfile 
     fields=('user','owner_of','total_years') 

что приводит, как это,

{ 
    { 
     "user": 
     { 
       "id: ..., 
       "first_name": ..., 
       "last_name": ..., 
       "email": ... 
      }, 
      "owner_of": ..., 
      "total_years" ... 
    }, 
    ... 
} 

More detailed explanation is here.

По умолчанию вложенные сериализаторы доступны только для чтения. Если вы хотите поддерживать операции записи в поле вложенного сериализатора, вам нужно будет создать методы create() и/или update(), чтобы явно указать, как должны быть сохранены дочерние отношения.

class ProfileSerializer(serializers.ModelSerializer): 
    user = AccountSerializer(required=True) 
    class Meta: 
     model = UserProfile 
     fields=('user','owner_of','total_years') 

    def create(self, validated_data): 
     user_data = validated_data.pop('user') 
     user= CustomUser.objects.create(**user_data) 
     user_profile=UserProfile.objects.create(user=user, **validated_data) 
     return user_profile 

    def update(self, instance, validated_data): 
     user_data = validated_data.pop('user', None) 
     user = instance.user 
     instance.owner_of = validated_data.get("owner_of", instance.owner_of) 
     instance.total_years= validated_data.get("total_years", instance.total_years) 
     instance.save() 
     if user_data: 
      user.first_name = user_data.get("first_name", user.first_name) 
      user.last_name = user_data.get("last_name", user.last_name) 
      user.email= user_data.get("email", user.email) 
      user.save() 
+0

Как сделать функцию обновления для полей в CustomUser через ProfileSerializer. –

+0

У меня есть обновленный ответ. Пожалуйста, проверьте :) – Sagar

+0

_KeyError_ ** user ** at 'user_data = validated_data.pop ('user')' –