Явное определение полей в 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)