Django嵌套关系manytomy序列化

2024-04-23 10:53:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在努力在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'文件我可以在数据库中存储值,但是如果我绕过序列化程序,就像上面所示的示例一样。在

有没有人也遇到过同样的问题,知道如何解决这个问题?将不胜感激!在


Tags: modelsfilenamelengthmaxpointcharfieldserializerfilesize