如何获取序列化程序方法字段中的所有实例



如何获取序列化程序方法字段中的所有实例

我有一个序列化程序方法字段,我将以上下文的形式向序列化程序传递列表数据,如下所示。

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

最新更新