Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架序列化器模型带有参数的自定义方法_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django Rest框架序列化器模型带有参数的自定义方法

Python Django Rest框架序列化器模型带有参数的自定义方法,python,django,django-rest-framework,Python,Django,Django Rest Framework,序列化程序字段是否可以使用带有参数的模型自定义方法作为其源?比如: models.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':

序列化程序字段是否可以使用带有参数的模型自定义方法作为其源?比如:

models.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
序列化程序.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')
它应该返回类似以下内容的响应:

{'x': 1, 'y': 0}
如果值
x
y
是静态的,您可以尝试使用以下选项:

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

模型 串行器
实际上,有没有一种方法可以将参数放在actualy Serializer Method Field属性上?不太可能,值是
x
还是
y
动态的?这些值是否存储在某个地方,如果是,那么您可以尝试在方法中检索值,而不是将其传递给该方法。如果是这样,那么我必须接受您的第一个建议,我实际上是在尝试覆盖sample_方法上的值,以便在我的自定义方法上应用DRY原则。因为我有三个自定义的模型方法,它们彼此有点相同,我可以把它们裁剪成一个,只需要参数
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
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')
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')
class SampleSerializer(serializers.ModelSerializer):

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