簡體   English   中英

使用django-rest-framework將模型對象序列化為JSON dict

[英]Serialize model objects into a JSON dict using django-rest-framework

因此,如果我在Django中具有以下模型類:

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列表?

您想要的是DictField而不是ListField ,所需的JSON輸出中的關鍵contact是一個對象(Python中的dict),而不是列表:

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,
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM