, , , kwargs django, rest_framework , OPTIONS API:
kwarg 'serial' CharField. django.db.models.CharField :
models.py
class RsCharField(models.CharField, metaclass=models.SubfieldBase):
def __init__(self, serial=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.serial = serial
class MyModel(models.Model):
fied_name1 = RsCharField(max_length=100, serial=123456, default="")
, : RsCharField , ModelSerializer, Django-model-RsCharField, serializer-RsCharField.
build_standard_field ModelSerializer, kwargs django-model-RsCharField -RsCharField
serializers.py
from rest_framework import serializers
class RsCharField(serializers.CharField):
def __init__(self, serial=None, **kwargs):
self.serial = serial
super().__init__(**kwargs)
class RsModelSerializer(serializers.ModelSerializer):
serializer_field_mapping = serializers.ModelSerializer.serializer_field_mapping
serializer_field_mapping[myapp.models.RsCharField] = RsCharField
def build_standard_field(self, field_name, model_field):
field_class, kwargs = super().build_standard_field(field_name, model_field)
if isinstance(model_field, kernel.fields.RsCharField):
kwargs['serial'] = model_field.serial
return field_class, kwargs
, SimpleMetadata, kwargs OPTIONS api :
class RsMetaData(SimpleMetadata):
def get_field_info(self, field):
field_info = super(RsMetaData, self).get_field_info(field)
if(isinstance(field, RsCharField)):
field_info['serial'] = field.serial
return field_info
settings.py
REST_FRAMEWORK = {
'DEFAULT_METADATA_CLASS': 'my.customize.RsMetaData'
}
, , . Tnx soooooot!