Python Django restframework序列化程序省略字段

2024-09-25 08:29:18 发布

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

我在使用python2.7和django rest框架时遇到了一个问题。当我序列化JSON数据时,序列化程序会忽略一个字段,我不明白为什么。这里有一些细节。在

缺少的字段是“country”。当我在/campaigns/:id上执行POST或PUT请求时

class CampaignSerializer(serializers.HyperlinkedModelSerializer):
    created_by = UserFullSerializer(read_only=True)
    country = CountrySerializer(read_only=True)

    class Meta:
        model = Campaign
        fields = ('id', 'created_by', 'name', 'media', 'status', 'begin', 'end', 'country')


class CampaignFullSerializer(serializers.HyperlinkedModelSerializer):
    client = ClientSerializer(read_only=True)
    collection = CollectionSerializer(read_only=True)
    created_by = UserFullSerializer(read_only=True)
    updated_by = UserFullSerializer(read_only=True)
    channels = ChannelSerializer(read_only=True, many=True)
    country = CountrySerializer(read_only=True)

    class Meta:
        model = Campaign
        fields = ('id',
                  'client',
                  'name',
                  'media',
                  'status',
                  'begin',
                  'end',
                  'created_at',
                  'created_by',
                  'updated_at',
                  'updated_by',
                  'collection',
                  'channels',
                  'country')

class CountrySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Country
        fields = ('id', 'name', 'code')


class Country(models.Model):
    name = models.CharField(max_length=255)
    code = models.CharField(max_length=255)

class Campaign(models.Model):
    name = models.CharField(max_length=255)
    media = models.IntegerField(choices=constant.MEDIA_CHOICES, default=0)
    status = models.IntegerField(choices=constant.STATUS_CHOICES, default=2)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(User, blank=True, null=True, related_name="created_by")
    updated_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    updated_by = models.ForeignKey(User, blank=True, null=True, related_name="updated_by")
    client = models.ForeignKey(client.Client)
    begin = models.DateField(blank=True, null=True)
    end = models.DateField(blank=True, null=True)
    collection = models.ForeignKey(collection.Collection, blank=True, null=True)
    country = models.ForeignKey(country.Country, blank=True, null=True)
    mediaplan = models.ForeignKey(mediaplan.Mediaplan, blank=True, null=True, default=None)
    channels = models.ManyToManyField(channel.Channel)

当我用下面的JSON在/campaign/id上进行POST时,除了country字段之外,其他所有内容都正常。在

^{pr2}$

当我打印请求数据我得到了所有的田地。我没有重写控制器的create方法。在

{
    ...
    u'country': {u'code': u'AL', u'id': 3, u'name': u'Albania'}
}

我的控制器看起来像:

class CampaignViewSet(viewsets.ModelViewSet):
    queryset = Campaign.objects.all()
    serializer_class = CampaignSerializer

    def create(self, request):
        logger.info(request.data)
        return super(CampaignViewSet, self).create(request, *args, **kwargs)

我试图重写CountrySerializer的create方法,当我打印已验证的_数据的内容时,OrderedDict中缺少country字段。。在

class CountrySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Country
        fields = ('id', 'name', 'code')

        def create(self, validated_data):
            logger.info(validated_data)

我真的迷路了,我找不到我的错误,也许你会的。谢谢你的时间。在


Tags: nameidtrueonlyreadbymodelscountry
1条回答
网友
1楼 · 发布于 2024-09-25 08:29:18

默认情况下,CountrySerializer作为嵌套序列化程序是只读的(per http://www.django-rest-framework.org/api-guide/relations/#nested-relationships),因此您必须重写POST/PUT活动序列化程序的create/update方法。您已尝试在国家/地区序列化程序上重写它。在

相关问题 更多 >