我一直在努力在django序列化程序中添加多对多关系,而不是通过视图进行访问。在
我在模型文件“MODISLevel1”和“FileProperties”中创建了2个类。其中MODISLevel1有一个名为“FileProperties”的字段,指向“FileProperties”类。在
模型看起来像:
class FileProperties(models.Model):
FileName = models.CharField(blank=True, max_length=1000)
FileID = models.CharField(blank=True, max_length=1000)
FileSize = models.CharField(blank=True, max_length=1000)
Updated = models.CharField(blank=True, max_length=1000)
GeoBox = models.CharField(blank=True, max_length=1000)
def __str__(self):
return self.FileName
class Meta:
ordering = ('FileName',)
class MODISLevel1(models.Model):
ProductLevel = models.CharField(max_length=7,
choices=ProductLevelsChoices,
default='MOD03')
SpacecraftType = models.CharField(max_length=5,
choices=SpacecraftTypeChoices,
default='Terra')
StartTimespan = models.TextField()
EndTimespan = models.TextField()
AOI = models.TextField()
DegreeNumbers = models.TextField()
filesProperties = models.ManyToManyField(FileProperties)
def __str__(self):
return self.ProductLevel
class Meta:
ordering = ('ProductLevel',)
至于序列化程序,我检查了http://django-rest-framework.org/api-guide/relations.html#nested-relationships,它告诉我们应该按照以下方式创建嵌套关系:
^{pr2}$对于视图文件,我尝试了不同的方法使其工作,但没有成功。在
1-从模型“MODISLevel1”创建一个实例,填充其字段,保存它,然后通过迭代填充m2m字段:
modisLevel1 = MODISLevel1()
modisLevel1.ProductLevel = productLevel
modisLevel1.SpacecraftType = spacecraftType
modisLevel1.StartTimespan = startTimespan
modisLevel1.EndTimespan = endTimespan
modisLevel1.AOI = AOI
modisLevel1.DegreeNumbers = degreeNumbers
modisLevel1.save()
#Inside a loop
f = FileProperties()
f.FileID = fileID
f.FileName = fileName
f.Updated = updated
f.GeoBox = geoBox
f.FileSize = fileSize
f.save()
modisLevel1.filesProperties.add(f)
serializer = MODISLevel1Serializer(data=modisLevel1)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我得到的错误是: { “非现场错误”:[ “无效数据” ] } 但是可以肯定的是,当我执行save命令“modisLevel1.save()”时,它会被添加到数据库中,但这不是我需要的。在
2-创建一个json文件并通过迭代将“fileproperties”附加到该文件:
jsonFile = {u"ProductLevel": productLevel, u"SpacecraftType": spacecraftType, u"StartTimespan": startTimespan,
u"EndTimespan":endTimespan, u"AOI": AOI, u"DegreeNumbers": u"POINT(22.5,28.34) POINT(28.64,28.34) POINT(29.4,19.16) POINT(19.19,19.3067)",
u"filesProperties": [] }
#inside the loop
jsonFile["filesProperties"].append({u"FileName":fileName, u"FileID":fileID, u"FileSize":fileSize, u"Updated":updated, u"GeoBox":geoBox})
serializer = MODISLevel1Serializer(data=jsonFile)
这个错误是,在设置m2m字段之前,基本模型必须有一个值: 无法添加“”:实例位于数据库“default”上,值位于数据库“None”上
3-创建dict并将模型解析到此字典,然后将FileProperties转换为字典并将其附加到先前创建的字典中:
modisLevel1 = MODISLevel1()
modisLevel1.ProductLevel = productLevel
modisLevel1.SpacecraftType = spacecraftType
modisLevel1.StartTimespan = startTimespan
modisLevel1.EndTimespan = endTimespan
modisLevel1.AOI = AOI
modisLevel1.DegreeNumbers = degreeNumbers
modisLevel1.save()
dict = model_to_dict(modisLevel1)
#FIXME!
dict['filesProperties'] = [{"FileName": "fileName", "FileID": "fileID", "FileSize": "fileSize", "Updated": "updated", "GeoBox": "geoBox"},
{"FileName": "fileName", "FileID": "fileID", "FileSize": "fileSize", "Updated": "updated", "GeoBox": "geoBox"},
{"FileName": "fileName", "FileID": "fileID", "FileSize": "fileSize", "Updated": "updated", "GeoBox": "geoBox"}]
serializer = MODISLevel1Serializer(data=dict)
这个错误和前一个一样。在
我确实查看了一些可能与此问题密切相关的帖子,但没有一篇文章与我合作: django rest nested relation in post/put
我的json post请求如下所示:
[
{
"ProductLevel": "MOD03",
"SpacecraftType": "Terra",
"StartTimespan": "2013.11.02",
"EndTimespan": "2013.11.02",
"AOI": "swath",
"DegreeNumbers": "POINT(22.5,28.34) POINT(28.64,28.34) POINT(29.4,19.16) POINT(19.19,19.3067)"
}
]
请注意视图.py'文件我可以在数据库中存储值,但是如果我绕过序列化程序,就像上面所示的示例一样。在
有没有人也遇到过同样的问题,知道如何解决这个问题?将不胜感激!在
目前没有回答
相关问题 更多 >
编程相关推荐