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