首页 > 解决方案 > 如何在 DRF 序列化器中制作自定义字段?

问题描述

我有模型交易

class Transaction(models.Model):
    created_at = models.DateTimeField()

以及其他具有带事务的 OneToOneField 的模型。

class RefillTransactionData(models.Model):
    transaction = models.OneToOneField(Transaction, on_delete=models.CASCADE)

class PurchaseTransactionData(models.Model):
    transaction = models.OneToOneField(Transaction, on_delete=models.CASCADE)

如何创建具有自定义字段“数据”的序列化器,该字段将包含其他序列化器?

Json shema 应该是这样的

{
    created_at: "2020-10-01"
    data: {
        RefillTransactionData: {},
        PurchaseTransactionData: {}
    }
}

对于 GET 请求,我可以使用该to_representation方法执行此操作,但是对于所有请求类型,我都需要相同的东西。

标签: pythondjangorestserializationdjango-rest-framework

解决方案


from rest_framework.fields import Field, SerializerMethodField

class DictField(Field):
    """
    A field handle dict fields
    """
    type_name = 'dictfield'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.style = {'base_template': 'textarea.html'}

    def to_representation(self, value):
        """" custom"""
        # do the customization according to u
        if isinstance(value, dict) or value is None:
            return value

    def to_internal_value(self, value):
        """ """
        # you can check and validate the data fromat
        if value == '' or value is None:
            return value
        pass

    def validate_empty_values(self, data):
        if data == '':
            self.fail('required')
        return super().validate_empty_values(data)


推荐阅读