最近,我一直在尝试使用Django尝试新事物,以尝试简化视图中的响应,这也许最终不值得,但我仍然很想知道是否可以实现。
因此,通常,我们将使用以下序列化器来返回信息;
# serializers.py
class SomeDefinedSerializer(serializers.ModelSerializer):
extra_model = SomeExtraModelSerializer()
greet_name = serializers.SerializerMethodField()
class Meta:
model = SomeDefinedModel
fields = ('name', 'age', 'field1', 'field2')
def get_greet_name(self, obj):
return f"Hello {obj.name}"
现在有了定义的序列化程序,我们可以返回 just 我们想要的字段,然后假设在SomeExtraModelSerializer()
中我们定义了一个字段子集,我们得到了一个漂亮的值字典致电.data
。
但是,这样做,对于大型应用程序,我们将最终编写大量的序列化程序,这些序列化程序仅用于特定的任务,从而产生许多几乎与虚拟相似的代码。当然,我们不必这样做,我们可以制作更通用的序列化器,但这意味着前端的所有不同任务最终都会获得大量信息,实际上,只有一小部分数据得到使用。
所以我最初的想法是创建一个基本的序列化器类,所有其他序列化器都将基于一个自定义init
方法,这样您就可以调用序列化器,并以{{1 }}您想要的字段,或排除...
但是后来我想,但是通过这种方式,我们仍然必须为某些任务定义序列化器。
如果在django视图中,我可以定义一个序列化程序及其嵌套的序列化程序,所有这些都具有我要立即返回的自己的特定字段,那将类似于:
kwargs
所以我写了基本的操作方法,它确实有效,除了主序列化程序返回我想要的字段,而嵌套序列化程序返回链接到第一个表的primary_keys列表通过外键。显然,我只需要字段# views.py
sus = SingleUseSerializer(userdata=userdata, \
model=SomeDefinedModel, \
many=False, \
fields=("name", "age", "field1", "field2",))
sus.load_extra_serializer(model=SomeExtraModel, \
return_name="extra_model", \
many=False, \
fields=("extra_field1", "extra_field2"))
return sus.checkout(query=my_queryset)
,但实际上看不到我要去哪里。代码如下:
"extra_field1", "extra_field2"
因此,我的问题是,如何成功地只返回动态构建的序列化程序中嵌套序列化程序上的选择字段,而不仅仅是pk值。注意,主序列化器的选择字段可以正常工作,并只返回我想要的...