Как добавить дополнительное поле в сериализатор django? - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь добавить дополнительное поле в мой сериализатор, но получаю следующую ошибку: -

"Поле 'поставщик" было объявлено в сериализаторе CreateUserSerializer, но не было включено в поля 'option. "

Вот мой serializer.py:-


class CreateUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()
    username = serializers.CharField()
    company = serializers.CharField()
    provider = serializers.CharField()
    password = serializers.CharField(write_only=True)
    company_detail = serializers.SerializerMethodField()
    branch_detail = serializers.SerializerMethodField()

    def get_company_detail(self):
        return {}

    def get_branch_detail(self):
        return {}

    def create(self, validated_data):
        try:
            with transaction.atomic():
                user = User.objects.create(**validated_data)

                user_profile = UserProfileModel.objects.create(user=user)
                user_profile.__dict__.update(**validated_data)
                user_profile.save()

                identity = FederatedIdentityModel.objects.create(user=user, oauth_provider=validated_data['provider'])

                company = CompanyModel.objects.create(user=user, name=validated_data['company'])

                branch = BranchModel.objects.create(user=user, name=validated_data['company'], company=company)

                return user

        except APIException:
            raise APIException(
                detail="Failed to register",
                code=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'password', 'email', 'username',
                  'company_detail', 'branch_detail']

Я не хочу добавлять поля компании и поставщика в опцию поля, поскольку она не является частью пользовательская модель. Я просто хочу использовать их в качестве полей для записи, чтобы я мог создать объект для двух моделей.

Как мне избавиться от следующей ошибки?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я думаю, вы не можете использовать это поле, не добавив его в fields. Что вы можете сделать, это просто разделить модель и дополнительные поля на два списка и затем определить:

provider = serializers.CharField()
company = serializers.CharField()
...
class Meta:
    model = User
    model_fields = ['first_name', 'last_name', 'password', 'email', 'username',
              'company_detail', 'branch_detail']
    extra_fields = ['company', 'provider']
    fields = model_fields + extra_fields
0 голосов
/ 18 марта 2020

Я нашел альтернативу для решения этой проблемы: -

class CreateUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()
    company = serializers.CharField(write_only=True)
    provider = serializers.ChoiceField(write_only=True, choices=OAUTH_PROVIDER_CHOICES)
    password = serializers.CharField(write_only=True)
    company_detail = serializers.SerializerMethodField()
    branch_detail = serializers.SerializerMethodField()

    # to get the details of company in response body
    def get_company_detail(self, obj):
        return {}

    # to get the details of branch in response body
    def get_branch_detail(self, obj):
        return {}

    def create(self, validated_data):
        # pop additional fields from validated data to avoid error
        company_name = validated_data.pop('company', None)
        provider = validated_data.pop('provider', None)
        try:
            with transaction.atomic():
                # create a user object
                user = User.objects.create(**validated_data)
                # create a user profile object
                user_profile = UserProfileModel.objects.create(user=user)
                user_profile.__dict__.update(**validated_data)
                user_profile.save()
                # create federated identity object using provider and email
                identity = FederatedIdentityModel.objects.create(user=user, oauth_provider=provider,
                                                                 email=validated_data['email'])
                # create company object
                company = CompanyModel.objects.create(user=user, name=company_name)

                return user

        except APIException:
            raise APIException(
                detail="Failed to register",
                code=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'password', 'email', 'username',
                  'company', 'provider', 'company_detail', 'branch_detail']

при создании пользователя я добавляю дополнительные поля и использую добавленное значение в качестве значения при создании объектов c и добавлении write_only = True в полях. В этом случае я могу добавить поля в свой список полей без всякой ошибки

...