我在使用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)
我真的迷路了,我找不到我的错误,也许你会的。谢谢你的时间。在
默认情况下,CountrySerializer作为嵌套序列化程序是只读的(per http://www.django-rest-framework.org/api-guide/relations/#nested-relationships),因此您必须重写POST/PUT活动序列化程序的create/update方法。您已尝试在国家/地区序列化程序上重写它。在
相关问题 更多 >
编程相关推荐