为列表序列化程序使用Django Rest框架时初始化init中的变量
我希望有一个序列化程序,其中序列化程序中的一个字段依赖于在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
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(),所以我希望每个实例设置一次,而不是每个列表序列化器设置一次。