为列表序列化程序使用Django Rest框架时初始化init中的变量

为列表序列化程序使用Django Rest框架时初始化init中的变量,django,django-rest-framework,Django,Django Rest Framework,我希望有一个序列化程序,其中序列化程序中的一个字段依赖于在init方法中创建的值 我试着做了如下的事情: class MySerializer(serializers.ModelSerializer): the_field_value = serializers.SerializerMethodField() another_field_value = serializers.SerializerMethodField() class Meta: model = MyMod

我希望有一个序列化程序,其中序列化程序中的一个字段依赖于在init方法中创建的值

我试着做了如下的事情:

class MySerializer(serializers.ModelSerializer):
   the_field_value = serializers.SerializerMethodField()
   another_field_value = serializers.SerializerMethodField()

class Meta:
    model = MyModel
    fields = ('id', 'the_field_value', 'another_field_value')

def get_the_field_value(self, obj):
    return "{0} ({1}) {2}".format(obj.name, obj.other_name, self.random_id)

def get_another_field_value(self, obj):
    return "{0} ({1}) {2}".format(obj.other_other_name, obj.other_name, self.random_id)

def __init__(self, *args, **kwargs):
    super(MySerializer, self).__init__(*args, **kwargs)
    self.random_id = randint(1, 5)
问题是当使用列表序列化程序时,每个列表项的随机id都是相同的

如何为每个列表项指定要运行的init方法


更新了一个更详细的示例。

没错,因为在创建实例时,
\uuuu init\uuuu
只会被调用一次,但如果您这样做:

class MySerializer(serializers.ModelSerializer):
    the_field_value = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = ('id', 'the_field_value')

    def get_the_field_value(self, obj):
        return "{0} ({1}) {2}".format(obj.name, obj.other_name, randint(1, 5))

您将在列表中获得随机值。希望它对您有所帮助。

我认为您希望使用,它允许您根据每个对象自定义对象列表的初始化。从文档中我们不太清楚它到底是如何工作的,但是看起来您可以根据每个对象定制对象列表的初始化——也许类似于这样的

class MySerializer(serializers.ModelSerializer):
    # all your fields and get methods...

    def random_init(self):
        return randint(1,5)

    @classmethod
    def many_init(cls, *args, **kwargs):
        # Instantiate the child serializer.
        kwargs['child'] = cls()
        # add the random value
        kwargs['random_id'] = cls.random_init()
        # Instantiate the parent list serializer.
        return MySerializer(*args, **kwargs)

    def __init__(self, *args, **kwargs):
        super(MySerializer, self).__init__(*args, **kwargs)
        self.random_id = kwargs.get('random_id', self.random_init() )

为什么必须在init方法中运行随机化器?如果你把它放在
get_the_field_value
中,那么你的问题就应该解决了。…@MarkChackerian我想利用在多个函数中生成的随机变量。在我的用例中,我想把这个随机变量用于几个SerializerMethodFields(),所以我希望每个实例设置一次,而不是每个列表序列化器设置一次。