Как сделать настраиваемое поле в DRF Serializer? - PullRequest
0 голосов
/ 10 января 2020

У меня есть модель Transasction

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

и другие модели, которые имеют OneToOneField с Transasction.

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

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

Как создать сериализатор с настраиваемым полем «данные», которое будет содержать другие сериализаторы?

A Json shema должна быть такой

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

Для запроса GET я могу сделать это с помощью метода to_representation, но мне нужны одни и те же вещи для всех запросов типов.

1 Ответ

0 голосов
/ 10 января 2020
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)

...