Django rest在序列化程序中将平面数据转换为关系数据

Django rest在序列化程序中将平面数据转换为关系数据,django,django-rest-framework,Django,Django Rest Framework,我有一个设置,我需要为现有的javascript数据模型编写一个API,我现在不想接触它。javascript数据的体系结构与我希望的服务器体系结构不同。因此,我的目标是在将数据发送到API时,将从javascript获取的数据转换为适合我的数据库模型。当从API请求数据时,它应该与javascript的预期数据模型相匹配 我想知道我是否可以用ModelSerializer实现这一点,如果可以,在哪里转换数据是正确的?在视野中?在序列化程序中 我的设置如下: //javascript struc

我有一个设置,我需要为现有的javascript数据模型编写一个API,我现在不想接触它。javascript数据的体系结构与我希望的服务器体系结构不同。因此,我的目标是在将数据发送到API时,将从javascript获取的数据转换为适合我的数据库模型。当从API请求数据时,它应该与javascript的预期数据模型相匹配

我想知道我是否可以用ModelSerializer实现这一点,如果可以,在哪里转换数据是正确的?在视野中?在序列化程序中

我的设置如下:

//javascript structure
{
  scores: [
    {
      id: 12,
      points: 2
      maxpoints: 12
      siteuxid: 'EXAMPLE'
    },
    { ... }
  ]
}

//More models in django
{
  scores: [
    {
      id: 12,
      points: 2,
      question: {
        id: 12,
        maxpoints: 12,
        siteuxid: 'EXAMPLE'
      }
    },
  ]
}
有没有人能给我举出同样的例子?基本上,这都是关于在服务器和客户端中拥有不同的数据结构并使它们兼容。谷歌搜索没有帮助

编辑: 我的第一个问题是,我没有在序列化程序中获取所有发布的数据。当我发帖的时候

{
    "scores": [{"id":"QFELD_1.1.3.QF2","siteuxid":"VBKM01_VariablenTerme","section":1,"maxpoints":4,"intest":false,"uxid":"ER2","points":0,"value":0,"rawinput":"363"}]
}

我只得到输出

userDataSerializer validated_data {'scores': [OrderedDict([('id', 'QFELD_1.1.3.QF2'), ('points', 0), ('value', 0), ('rawinput', '363')])]}

没有
score.maxpoints
等等(因为它不在序列化程序中,但如何将其添加到已验证的数据中,以便从UserDataSerializer中发布的数据创建正确的问题对象)

答案是肯定的,您将使用视图修改输入数据,因为在视图将数据发送到序列化程序之前,必须对数据进行这些调整。这与您在已验证的数据中只看到序列化程序的属性的原因相同—序列化程序会忽略它无法识别的所有属性

因此,首先,更改视图的
post
方法中的
request.data
,使其按需结构化

def post(self, request, *args, **kwargs):
    request.data['question'] = {
        'maxpoints': request.data.pop('maxpoints'),
        'siteuxid': request.data.pop('siteuxid'),
    }
这应该是你需要开始的全部

但是,请注意,在您的示例中,
question
具有
id:12
,这很奇怪。如果您试图创建一个
问题
对象以及
分数
对象,则该对象应该没有
id
。但是,如果问题是现有对象,则不应发送dict,而应只发送
id


例如,您应该在输入中发送
问题:1
。DRF的
ModelSerializer
足够聪明,可以知道您试图保存的
分数
问题
相关,该问题具有
id=1
。在执行此操作时,检查序列化程序的
验证的\u数据
,您将看到
id=1的
问题
的实例。魔法

这通常会进入序列化程序,DRF文档至少会让您开始。除非存在非平凡的业务逻辑——在这种情况下,您可能希望创建一个适配器或代理模型,这些模型由ModelSerializer序列化,并有办法保存/更新其相应的常规模型。如果您需要有关业务逻辑的帮助,则必须提供更多有关业务逻辑的详细信息。为了向您显示更多my code,序列化程序当然只会返回
Meta
中指定字段的值。将缺少的字段添加到
Meta.fields
中,并添加必要的方法来验证和转换序列化程序中的字段-或者在视图中进行验证,如果您愿意的话。虽然如果您只支持这种格式,那么这就是序列化程序应该做的事情——即传入数据和内部数据结构之间的抽象层。
def post(self, request, *args, **kwargs):
    request.data['question'] = {
        'maxpoints': request.data.pop('maxpoints'),
        'siteuxid': request.data.pop('siteuxid'),
    }