我有几个视图集,其中的几个端点使用一个序列化程序。一个端点甚至没有元类, 它执行特定操作并在方法 to_representation 中使用相同的序列化程序。在这个序列化程序中,我像这样使用方法字段:
some_field = serializers.SerializerMethodField()
def get_some_field(self, obj):
return bool(obj.something_attr)
something_attr我进入视图集
queryset =MyModel.objects.annotate(something_attr=(...))
在其他视图集中,没有这样的字段,因此它们使用其他查询组。我可以在不创建一堆其他序列化程序的情况下解决此问题吗?我的感谢!
根据我的理解,您正在尝试使用具有不同视图的单个序列化程序类 - 但每个视图都需要不同的字段,对吧?
class DynamicFieldSerializerMixin:
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
super().__init__(*args, **kwargs)
if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)
您可以使用此 mixin 为单个序列化程序类的每个视图动态定义字段。只需将关键字参数与字段名称列表一起传递fields=[]
即可。