Django Rest框架,嵌套序列化程序时缺少一些字段

2024-03-29 10:45:34 发布

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

问题是:当我将someModelSerializer.data作为anotherModelSerializer的嵌套数据传递时,然后我将anotherModelSerializer.data传递给Response,在响应中我只看到SomeModel的两个字段,而不是5。但是当我将someModelSerializer.data直接传递给Response时,我可以看到所有的模型字段都存在。你知道吗

详情如下。你知道吗

我有翻译历史模型

class TranslationHistory(models.Model):
  created = models.DateTimeField(auto_now_add=True)
  updated = models.DateTimeField(auto_now=True)
  string = models.CharField(max_length=255)
  count = models.IntegerField(default=1)

  user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='translation_history')

它是TranslationHistorySerializer

class TranslationHistorySerializer(serializers.ModelSerializer):

class Meta:
    model = TranslationHistory

user = serializers.PrimaryKeyRelatedField(read_only=True, default=None)
count = serializers.IntegerField(read_only=True)

def validate_user(self, value):
    return self.context['request'].user

def update(self, instance, validated_data):
    instance.count += 1
    instance.save()
    return instance

我还有一个虚拟实体翻译,它不是模型。它有自己的序列化程序。你知道吗

class TranslationSerializer(serializers.Serializer):
  translation_history = TranslationHistorySerializer() # nested serializer
  translation = serializers.CharField()

在我看来,如果我喜欢这个

history = TranslationHistory().findByUserAndString(request.user, string)
historySerializer = TranslationHistorySerializer(history)
return Response(historySerializer.data, status=status.HTTP_200_OK)

我有这样的反应。你知道吗

{
  "id": 18,
  "user": 1,
  "count": 72,
  "created": "2015-07-15T15:35:50.751219Z",
  "updated": "2015-07-24T15:37:04.247469Z",
  "string": "hello"
}

但是如果在我看来我喜欢这个

history = TranslationHistory().findByUserAndString(request.user, string)
historySerializer = TranslationHistorySerializer(history)
serializer = TranslationSerializer(
  data={
         'translation_history': historySerializer.data,
         'translation': 'hello'
       },
  context={'request': request}
)
serializer.is_valid(raise_exception=True)
return Response(serializer.data, status=status.HTTP_200_OK)

我有这样的反应。你知道吗

{
  "translation_history": {
    "user": 1,
    "string": "hello"
  },
 "translation": "hello"
}

为什么在这种情况下我只得到userstring字段?你知道吗


Tags: truedatastringreturnmodelsresponserequestcount