【发布时间】:2015-06-18 21:27:00
【问题描述】:
我有一个序列化程序(django rest 框架)可以根据 get 请求返回模型对象:
class MyModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyModel
在我的视图中实例化这个序列化器后,我使用 serializer.data 返回所有字段的键/值:
class MyModelAPIView(APIView):
def get(self, request, **kwargs):
obj_pk = kwargs.get('pk')
obj = MyModel.objects.get(pk=obj_pk)
serializer = serializers.MyModelSerializer(obj)
return Response(serializer.data)
这是 json 中返回的示例:
{"firstname": "John", "lastname": "doe", "active": true}
但是,我正在使用 JavaScript 从中生成一个表单(动态生成的表单),并且我想知道每个键/对值是什么类型的字段,因此我可以相应地生成表单。我正在尝试对 ModelSerializer 进行子类化,以便返回的 JSON 如下所示:
{"firstname": {"value": "john", "type": "TextField"},
"lastname": {...},
"active": {"value": true, "type": "BooleanField"}}
这将允许我在我的表单中生成正确的输入类型。得到这个的最好方法是什么? 可能有一种更简单的方法可以使用与此完全不同的 Rest Framework 从 JSON 响应动态生成表单(希望不那么乏味)。如果是这样,我也有兴趣了解它!
谢谢,
【问题讨论】:
-
这种技术的一个警告是,如果该字段是多项选择,我只会在需要所有值来动态创建表单下拉列表时获取当前值。因此,希望有一种更直接的方法来获取从 JSON 生成的表单。
-
旁注,您为什么没有在序列化程序上声明您的字段?即
fields=['firstname', 'last name']无需为此覆盖get方法。 -
原因不多。我试图操纵视图中的响应数据,这就是原因。
-
我一直在研究的潜在解决方案之一是 HTMLFormRenderer,它可以为我处理大部分繁重的工作。这里有潜在的好方向吗?
-
我想到了两种方法。您可以读取字段元数据,即
firstname .`get_internal_type()或model._meta.get_field('firstname').get_internal_type。或者您可以自己在数据库中描述数据并将其添加为嵌套序列化程序。这将需要您重新设计模型。
标签: django django-models django-forms django-rest-framework