Явное определение полей в ModelSerializer переопределяет параметры Model

Представьте себе простую модель, как показано ниже:

from utils.validators import name_validator

class Customer(models.Model):
    name = models.CharField(verbose_name="Customer Name", validators=[name_validator])
    email = models.EmailField(verbose_name="Customer Email")

    def __str__(self):
        return self.name

Теперь, если я явно определяю файл на моем serializer, оба validators и verbose_name теряются. Я могу использовать label= и validatos= при определении поля на моем serializer, но я не хочу повторяться. Что если у меня несколько сериализаторов, указывающих на одну и ту же Модель?

class CustomerSerilizer(serializers.ModelSerializer):
    custom_field_name = serializers.CharField(source="name")

    class Meta:
        model = Customer
        fields = "__all__"

Есть ли способ предотвратить это?

Я не уверен, идеальный ли это способ или нет, но мне удалось добиться желаемого поведения, написав пользовательский ModelSerializer, который устанавливает label и validators, если они не передаются при явном определении поля на сериализаторе.

class CustomModelSerializer(serializers.ModelSerializer):
    def __init__(self, *args, **kwargs):
        super(CustomModelSerializer, self).__init__(*args, **kwargs)

        model = self.Meta.model
        model_fields = [f.name for f in model._meta.get_fields()]

        for field_name, field_instance in self.fields.items():
            source_field = field_instance.source

            if source_field in model_fields:
                model_field = model._meta.get_field(source_field)

                if "label" not in field_instance._kwargs:
                    field_instance.label = model_field.verbose_name

                if "validators" not in field_instance._kwargs:
                    field_instance.validators.extend(model_field.validators)

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