【发布时间】:2019-02-13 16:56:44
【问题描述】:
我正在使用 Django Rest 框架构建一个 API。主要要求是它应该允许在调用中灵活地包含额外的字段。基于 POST 调用,我想在 Django 中创建一条新记录,其中一些字段(名称和编号不同)应添加到 JSON 字段(lead_request)。
我怀疑我是否应该使用 ModelSerializer,因为我不知道如何处理应该作为 JSON 合并到一个字段中的各种字段。在 create 方法中,我无法将其他字段合并到 JSON 中,因为它们没有经过验证。
class Leads(models.Model):
campaign_id = models.ForeignKey(Campaigns, on_delete=models.DO_NOTHING)
lead_email = models.EmailField(null=True, blank=True)
lead_request = JSONField(default=dict, null=True, blank=True)
class LeadCreateSerializer(serializers.ModelSerializer):
def get_lead_request(self):
return {key: value for key, value in self.request.items() if key.startswith('rq_')}
class Meta:
model = Leads
fields = ['campaign_id',
'lead_email',
'lead_request']
def create(self, validated_data):
return Leads.objects.create(**validated_data)
文档主要讨论分配验证数据,但在这里这是不可能的。任何指针都会很有用,因为我不熟悉 DRF。
【问题讨论】:
-
能否请您在这篇文章中也包含您的模型定义。这样有助于理解模型结构,也有助于人们产生答案。
-
其余框架已经处理了
JSONFields:django-rest-framework.org/api-guide/fields/#jsonfield 的验证/创建,所以如果你的模型上有它并且你正在使用模型序列化器,你应该很高兴 - 通过添加jsonfield_name,然后在您的body上将 json 传递给它。类似:{ "lead_request": {"key1": "val1", "key2": "val2"} } -
@Shakil 我已添加模型,感谢您对此进行调查
-
@henriquesalvaro 好点,实际上这在理论上可能是一个解决方案,但不适用于我的用例。该 API 也将被其他程序员使用,这可能是他们在没有大量支持的情况下无法做到的事情。另外,我想允许将链接中的变量作为参数传递,并且很可能不起作用,将 JSON 作为参数传递。感谢您的帮助!
-
在这种情况下(特别是考虑到您想要接收查询参数),我认为您最好在将数据传递给序列化程序之前对其进行处理。您可以在视图集上操作
request.data和query_params,您甚至可以执行所有这些操作并生成等效的json形式的lead_request,然后将其传递给您已经存在的序列化程序。
标签: python-3.x django-rest-framework django-views