Django-countries как добавить поле сериализатора

Я пытаюсь добавить поле CountryField в сериализатор для процесса Register (используя dj-rest-auth) и не могу найти правильный способ его реализации.

Все ответы, которые я нашел, просто говорят использовать то, что написано в документации, но мне это не помогает, возможно, я просто делаю это неправильно.

Вот что говорится в документации по django-countries:

from django_countries.serializers import CountryFieldMixin

class CountrySerializer(CountryFieldMixin, serializers.ModelSerializer):

class Meta:
    model = models.Person
    fields = ('name', 'email', 'country')

Мне нужно добавить поле здесь:

class CustomRegisterSerializer(RegisterSerializer, CountryFieldMixin):

    birth_date = serializers.DateField()
    country = CountryField()
    gender = serializers.ChoiceField(choices=GENDER)

    # class Meta:
    #     model = User
    #     fields = ('country')

    # Define transaction.atomic to rollback the save operation in case of error
    @transaction.atomic
    def save(self, request):
        user = super().save(request)
        user.birth_date = self.data.get('birth_date')
        user.country = self.data.get('country')
        user.gender = self.data.get('gender')
        user.save()
        return user

Я пробовал разные вещи, кроме этого, и ничего не помогло.

Для сериализатора вы импортируете CountryField модуль django_countries.serializer_fields, так:

from django_countries.serializer_fields import CountryField

class CustomRegisterSerializer(RegisterSerializer):
    # …
    country = CountryField()
    # …

Если вместо этого вы хотите работать с Mixin (который будет использовать такое поле сериализатора CountryField), вы должны указать CountryFieldMixin перед RegisterSerializer, иначе он не переопределит метод .build_standard_field(…).

Таким образом, вы наследуете с:

class CustomRegisterSerializer(CountryFieldMixin, RegisterSerializer):
    # …

В этом случае вам следует не указывать поле сериализатора country вручную, так как это сделает миксин неэффективным.

Вернуться на верх