如何获取序列化程序方法字段中的所有实例
我有一个序列化程序方法字段,我将以上下文的形式向序列化程序传递列表数据,如下所示。
name_list = [ "abc", "def",....]
obj_list = abc.objects.all()
Serializer = abcSerializer (obj_list, context=name_list, many=True)
class abcSerializer (serializers.ModelSerializer):
xyz = serializers.SerializerMethodField ("getXYZ", read_only=True)
class Meta:
model = abc
def getXYZ (self, data):
# here I want all instanceses, but I got only one instance in data.
我想一个接一个地附加name_list数据以安装具有相同索引的数据?如何在序列化程序方法字段中获取所有实例?
为什么需要所有实例?如果您想在所有实例中操作某个东西,最好在将其作为序列化程序中的参数传递之前进行操作。如果要获取单个实例,则需要获取data
参数中的值。但是你的契约是错误的。尝试如下:
class abcSerializer (serializers.ModelSerializer):
xyz = serializers.SerializerMethodField("getXYZ")
class Meta:
model = abc
def getXYZ(self, data):
print(data) # it will print a instance of abc
return value_based_on_data
更新
那么我认为你应该这样尝试:
第一次更新序列化程序类:
class abcSerializer (serializers.ModelSerializer): # use PascalCase for naming classes
xyz = serializers.ReadOnlyField()
class Meta:
model = abc
fields = '__all__' # use PascalCase for naming classes
然后使用以下代码获取xyz
:的值
obj_list = []
for i, item in enumerate(abc.objects.all()):
item.xyz = name_list[i]
obj_list.append(item)
abcSerializer(obj_list, many=True).data
在深入调试之后,我意识到我应该与社区分享我的发现。
Look at the below line:
Serializer = abcSerializer (obj_list, context=name_list, many=True)
这里many=Truemake的abcSerializer到列表序列化程序,根据列表序列化程序中的rest框架文档,我们可以在更新方法中访问queryset的所有对象,如下面的
class BookListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
# Maps for id->instance and id->data item.
book_mapping = {book.id: book for book in instance}
data_mapping = {item['id']: item for item in validated_data}
# Perform creations and updates.
我发现我们也可以在任何方法中访问queryset的所有对象,即使在serializerMethodField中也可以使用以下语法
def getXYZ (self, data):
objects = self.instance