Django Rest Framework Serializer Model 带参数的自定义方法

Dea*_*ada 3 python django django-rest-framework

序列化器字段是否可以使用模型的自定义方法,并将参数作为其来源?就像是:

模型.py

class Sample(models.Model):
    name = models.CharField(max_length=100, default=None)

    def sample_method(self, param):
        if param == 'x':
            return 1
        elif param == 'y':
            return 0
Run Code Online (Sandbox Code Playgroud)

序列化程序.py

class SampleSerializer(serializers.ModelSerializer):
    x = # serializer field that returns sample_method custom method with a parameter of 'x'
    y = # serializer field that returns sample_method custom method with a parameter of 'y'

    class Meta:
        model = Sample
        fields = ('x', 'y')
Run Code Online (Sandbox Code Playgroud)

它应该作为响应返回类似于:

{'x': 1, 'y': 0}
Run Code Online (Sandbox Code Playgroud)

Amy*_*yth 9

SerializerMethodField如果值xy是静态的,您可以尝试使用如下:

楷模

class Sample(models.Model):
    name = models.CharField(max_length=100, default=None)

    def sample_method(self, param):
        if param == 'x':
            return 1
        elif param == 'y':
            return 0
Run Code Online (Sandbox Code Playgroud)

序列化器

class SampleSerializer(serializers.ModelSerializer):
    x = SerializerMethodField()
    y = SerializerMethodField()

    class Meta:
        model = Sample
        fields = ('x', 'y')

    def get_x(self, obj):
        return obj.sample_method('x')

    def get_y(self, obj):
        return obj.sample_method('y')
Run Code Online (Sandbox Code Playgroud)

另一种可能的方法是在模型本身上创建两个单独的属性(sample_method使用值x或显式调用y),并简单地将名称用作序列化程序中的字段。例如:

楷模

class Sample(models.Model):
    name = models.CharField(max_length=100, default=None)

    def sample_method(self, param):
        if param == 'x':
            return 1
        elif param == 'y':
            return 0

    @property
    def x(self):
        return self.sample_method('x')

    @property
    def y(self):
        return self.sample_method('y')
Run Code Online (Sandbox Code Playgroud)

序列化器

class SampleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Sample
        fields = ('x', 'y')
Run Code Online (Sandbox Code Playgroud)