2016-06-23 2 views
0

だから私は、Djangoの中に、次のモデルクラスがある場合:のSerializeモデルは、ジャンゴ・休息・フレームワークを使用してJSONの辞書にオブジェクト

class Person(models.Model): 
    name = models.CharField(max_length=250) 
    is_active = models.BooleanField(default=True) 

    address_line1 = models.CharField(max_length=100, blank=True, null=True) 
    address_line2 = models.CharField(max_length=100, blank=True, null=True) 
    town = models.CharField(max_length=100, blank=True, null=True) 
    county = models.CharField(max_length=100, blank=True, null=True) 
    post_code = models.CharField(max_length=100, blank=True, null=True) 

をし、私の目標は、次のJSONにそれをシリアル化することです:

{ 
    "name": "Joe Bloggs", 
    "is_active": true, 
    "contact": { 
     "address1": "Bloggs House" 
     "address2": "1 Bloggs Lane", 
     "city": "Bloggs Town", 
     "county": "Bloggs Town", 
     "zip": "BL0 GG5", 
     "country": "UK" 
    } 
} 

私は次のことを試してみましたが、それはうまくいきませんでしたし、私はそれがserializers.ListFieldは(私は同じもののリストについては、あることを意味していると思い)動作するように意図された方法ではありませんかなり確信している:

class MailChimpListSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 

    contact = serializers.DictField(
     address1=serializers.CharField(source='address_line1'), 
     address2=serializers.CharField(source='address_line2'), 
     city=serializers.CharField(source='town'), 
     state=serializers.CharField(source='town', read_only=True), 
     zip=serializers.CharField(source='post_code'), 
     country=serializers.SerializerMethodField() 
    ) 

    permission_reminder = serializers.SerializerMethodField() 

    campaign_defaults = serializers.DictField(
     from_name=serializers.CharField(source='name'), 
     from_email=serializers.CharField(source='primary_contact_email'), 
     subject=serializers.CharField(), 
     language=serializers.CharField() 
    ) 

    email_type_option = serializers.SerializerMethodField() 

    fields = ('name', 'contact', 'permission_reminder', 
       'campaign_defaults', 'email_type_option') 

住所などを含む連絡先JSONリストを作成するにはどうすればよいですか?何をしたい

答えて

3

DictFieldないListFieldで、ご希望のJSON出力のキーcontactは、オブジェクト(Pythonで辞書)、ではないリストである:

contact = serializers.DictField(
      address1=serializers.CharField(source='address_line1'), 
      address2=serializers.CharField(source='address_line2'), 
      ... 
) 

ここより手動で別の方法があります:

class MySerializer(serializers.ModelSerializer): 
    contact = serializers.SerializerMethodField() 
    def get_contact(self, obj): 
     return dict(
      address1=obj.address1, # As long as the fields are auto serializable to JSON 
      some_field=SomeSerializer(obj.some_field).data, 
     ) 
+0

私はエラーを取得しています:__init__ スーパー(DictField、自己)に、ライン1495 '.__のinit __(* argsを、** kwargsから)' 'TypeError例外:)__init __(予期しないキーワード引数 'を得ました「都市」 – Cephlin

+1

@Cephlin only 'city'?他のフィールドは問題ありませんでしたか?私は少しこれを試してみます。その間、追加した他の手動方法を試してみてください。 – bakkal

+0

私はそれらをひとつずつコメントアウトするときに、同じ例外が発生します。ああSerializerMethodField、私はそうしないと思った。 – Cephlin