Django restframework serializers 設置各種格式

  • 感覺是Minxin撐起了restframework,所以這裏就使用Minxin大法
    Minxin
from rest_framework.fields import Field


class MinxinCustomField:
    """
    想要什麼格式,您就儘管設置什麼格式
    下面右邊的格式定義,在rest_framework.fields  Field
    """
    def __init__(self, *args, **kwargs):
        if hasattr(self, 'serializer_field_mapping') and hasattr(self, 'CustomField'):
            custom_fields = [cf for cf in dir(self.CustomField) if not (cf.startswith('__') and cf.endswith('__'))]
            for default_models_field, default_field in self.serializer_field_mapping.items():
                for field in custom_fields:
                    if issubclass(default_field, Field) and field == default_field.__name__:
                        self.serializer_field_mapping.update(
                            {
                                default_models_field: getattr(self.CustomField, field)
                            }
                        )
                        break
        super(__class__, self).__init__(*args, **kwargs)
  • 自定義格式類,時間格式和時區
import pytz
time_format = "%Y-%m-%d %H:%M:%S"

class MyDateTimeField(serializers.DateTimeField):
    def __init__(self, *args, **kwargs):
        super(MyDateTimeField, self).__init__(format=time_format, default_timezone=pytz.utc, *args, **kwargs)
  • 應用場景,添加Minxin類,格式手動綁定配置
class ProjectSerializer(MinxinCustomField, serializers.ModelSerializer):
    class CustomField:
        DateTimeField = MyDateTimeField

    class Meta:
        model = Project
        fields = '__all__'
  • 注意,CustomField的關鍵字名 和自定義格式,必須是參考如下右邊那列
# path: reste_framework.serializers.py  ModelSerializer
serializer_field_mapping = {
        models.AutoField: IntegerField,
        models.BigIntegerField: IntegerField,
        models.BooleanField: BooleanField,
        models.CharField: CharField,
        models.CommaSeparatedIntegerField: CharField,
        models.DateField: DateField,   
        models.DateTimeField: DateTimeField,
        models.DecimalField: DecimalField,
        models.EmailField: EmailField,
        models.Field: ModelField,
        models.FileField: FileField,
        models.FloatField: FloatField,
        models.ImageField: ImageField,
        models.IntegerField: IntegerField,
        models.NullBooleanField: NullBooleanField,
        models.PositiveIntegerField: IntegerField,
        models.PositiveSmallIntegerField: IntegerField,
        models.SlugField: SlugField,
        models.SmallIntegerField: IntegerField,
        models.TextField: CharField,
        models.TimeField: TimeField,
        models.URLField: URLField,
        models.GenericIPAddressField: IPAddressField,
        models.FilePathField: FilePathField,
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章