我正在编写一个Django应用程序,它非常庞大且拥有大量API端点。此应用程序使用DRF序列化通过JSON发送到前端的信息,并反序列化从前端通过JSON发送的信息。
为了便于解释我的情况,让我们考虑一个简单的模型。所以,让我们说我有一个模型A
。
class A(models.Model):
field1 = models.CharField(max_length=255)
field2 = models.CharField(max_length=255)
field3 = models.CharField(max_length=255)
我对这些场景有看法。
field1
,根据将填充并保存field2
和field3
field2
field2
和field3
这让我想到了我的问题。我应该为上面的所有观点分别写一个ModelSerializer
吗?或者DRF是否有一些工具来在视图中指定模型字段名称?如果序列化程序是基于每个视图编写的,那么序列化程序与视图相比更多地与视图相关联吗?
感谢您帮助我。 DRF文档和任何数量的Google搜索都无法解决我的问题。
答案 0 :(得分:1)
您不必为每个视图编写不同的序列化程序。相反,您可以使用它们的一些功能来实现您的目标:
1)要使用单个字段进行创建,请将field2
和field3
标记为只读。这样,在创建模型时验证输入数据时,不会考虑它们。
2)要根据视图中输入的某些参数或不同视图决定显示哪些字段,您可以dynamically modify the fields of the serializer:
class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""
def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)
# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__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)