2017-06-27 9 views
3

django restフレームワークを使用して複数のネストされた書き込み可能シリアライザを実装しようとしています。私は利用可能なドキュメントを読んでいるhttp://www.django-rest-framework.org/api-guide/serializers/#writable-nested-representationsDjango Restフレームワーク複数ネストライタブルシリアライザ

私は1つのレベルの巣のためにこれを行うことができましたが、複数の巣があるときに問題があります。

class FarmerSerializer(serializers.ModelSerializer): 
    dob = serializers.DateField(write_only=True) 
    gender = serializers.CharField(write_only=True) 

    farms = FarmSerializer(required=False, many=True) 

    class Meta: 
     ... 

    def create(self, validated_data): 
     # check if nested objects were provided, in particular farms 
     farms = validated_data.pop('farms', None) 

     farmer = Farmer(**validated_data) 
     farmer.added_by_id = validated_data.get('added_by_id') 
     farmer.save() 

     if farms is not None: 
      for farm in farms: 
       new_farm = Farm.objects.create(farmer=farmer, added_by=farmer.added_by, **farm) 

       # check for blocks -- fails 
       blocks = farm.pop('farm_blocks', None) 
       if blocks is not None: 
        for block in blocks: 
         FarmBlock.objects.create(farm=new_farm, added_by=farmer.added_by, **block) 

     return farmer 

class FarmSerializer(serializers.ModelSerializer): 
    county = CountySerializer(read_only=True) 
    county_id = serializers.UUIDField(write_only=True) 

    farm_blocks = FarmBlockSerializer(required=False, many=True) 

class FarmBlockSerializer(serializers.ModelSerializer): 
    ... 

私はすべての3つのレベルにネストされているJSONを投稿して保存できるようにしたいと思いますが、農家、農場や牧場ブロックをすなわち:例えば、私はこれらの3つのシリアライザを持っています。これは現在、Farmerと関連するファームの最初の2つのレベルを保存しているときに機能します。 それが助け場合は、ここで私が保存しようとしてるJSON構造である:

[ 
    { 
     "name": "Ashley King", 
     "phone_number": "0765124764", 
     "gender": "F", 
     "dob": "1980-11-26", 
     "national_id": "29719008", 
     "farms": [ 
      { 
       "name": "Big Farm 3", 
       "farm_size": "18", 
       "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2", 
       "constituency": "Nakuru", 
       "ward": "Town", 
       "town": "Nakuru", 
       "contact_name": "Winnie W.", 
       "contact_phone_number": "0724301432", 
       "farm_blocks": [ 
        {"block_size": 4.56} 
       ] 
      }, 
      { 
       "name": "Big Farm 4", 
       "farm_size": "9.6", 
       "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2", 
       "constituency": "Nakuru", 
       "ward": "Town", 
       "town": "Nakuru", 
       "contact_name": "Winnie W.", 
       "contact_phone_number": "0724301432" 
      } 
     ] 
    }, 
    { 
     "name": "Dennis Wainaina", 
     "phone_number": "0764578389", 
     "gender": "M", 
     "dob": "1988-11-26", 
     "national_id": "27675654", 
     "farms": [ 
      { 
       "name": "Big Farm 6", 
       "farm_size": "18", 
       "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2", 
       "constituency": "Nakuru", 
       "ward": "Town", 
       "town": "Nakuru", 
       "contact_name": "Winnie W.", 
       "contact_phone_number": "0724301432" 
      }, 
      { 
       "name": "Big Farm 5", 
       "farm_size": "9.6", 
       "county_id": "5e208ba8-5f6c-4dac-a946-dada0c5250a2", 
       "constituency": "Nakuru", 
       "ward": "Town", 
       "town": "Nakuru", 
       "contact_name": "Winnie W.", 
       "contact_phone_number": "0724301432" 
      } 
     ] 
    } 
] 
+0

は、あなたのモデルを投稿することができ、あなたのcreate方法を編集できます?? – zaidfazil

答えて

2

たぶん、あなたは多少このように、

def create(self, validated_data): 
    farms = validated_data.pop('farms', None) 
    farmer = Farmer.objects.create(**validated_data) 

    if farms is not None: 
     for farm in farms: 
      #pop farm_blocks before creating new_farm 
      blocks = farm.pop('farm_blocks', None) 
      new_farm = Farm.objects.create(farmer=farmer, added_by=farmer.added_by, **farm) 
      #then create farm_bocks 
      if blocks is not None: 
       for block in blocks: 
        FarmBlock.objects.create(farm=new_farm, added_by=farmer.added_by, **block)    

    return farmer 
+0

私はそれが問題だとは思わない!これで解決しました。本当にありがとう! – Denny

+0

サポートをよろしくお願いします。 – zaidfazil

関連する問題