4

ビューからアクセスするよりも、djangoシリアライザーに多対多の関係を追加するのに苦労しています。

モデルファイル「MODISLevel1」と「FileProperties」に2つのクラスを作成しました。MODISLevel1 には、「FileProperties」クラスを指す「filesProperties」というフィールドがあります。

モデルは次のようになります。

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を確認しました。これは、ネストされた関係を次の方法で作成する必要があることを示しています。

class FilePropertiesSerializer(serializers.ModelSerializer):

    class Meta:
        model = FileProperties
        fields = ('id', 'FileName', 'FileID', 'FileSize', 'Updated', 'GeoBox')

class MODISLevel1Serializer(serializers.ModelSerializer):

    filesProperties = FilePropertiesSerializer(many=True)

    class Meta:
        model = MODISLevel1
        fields = ('id', 'ProductLevel', 'SpacecraftType', 'StartTimespan', 'EndTimespan', 'AOI', 'DegreeNumbers', 'filesProperties')

ビューファイルについては、さまざまな方法で機能させようとしましたが、成功しませんでした。

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)

私が得たエラーは次のとおりです: { "non_field_errors": [ "Invalid data" ] } しかし、保存コマンド "modisLevel1.save()" を実行したときにデータベースに追加されたことは確かですが、それは私が必要とするものではありません。

2-json ファイルを作成し、繰り返しを通じて「filesProperties」を追加します。

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フィールドを設定する前にベースモデルに値が必要であるというエラーをスローします:「追加できません」:インスタンスはデータベース「デフォルト」にあり、値はデータベース「なし」にあります

3-辞書を作成し、モデルをこの辞書に解析してから、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 relationship in post/put

私のjson投稿リクエストは次のようになります。

[
    {
        "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)"
    }
]

「view.py」ファイルではデータベースに値を保存できますが、上記の例のようにシリアライザーをバイパスすると注意してください。

それで、誰かが同じ問題を経験し、これを修正する方法を知っていましたか? 高く評価されます!

4

0 に答える 0