首页 > 解决方案 > Django Serializer 显示“字符”:“字典对象 (256)”,而不是实际字符

问题描述

我正在使用 Django 休息框架,我正在尝试对 GET 命令执行 JOIN。

我有以下看法:

class CharacterView(APIView):
    permission_classes = (AllowAny,)

    def get(self, request, user_id):
        character_saves = Char.objects.select_related('character').filter(
            user_id=user_id)
        serializer = CharacterSerializer(character_saves, many=True)
        return Response({"characters": serializer.data})

以及以下序列化程序:

class CharacterSerializer(serializers.Serializer):
    character_id = serializers.IntegerField()
    user_id = serializers.IntegerField()
    active = serializers.BooleanField()
    character = serializers.CharField()

    def create(self, validated_data):
        return Char.objects.update_or_create(
            user_id=validated_data.pop('user_id'),
            character_id=validated_data.pop('character_id'),
            defaults=validated_data
        )

然而,我得到以下数据:

"characters": [
    {
        "character_id": 256,
        "user_id": 1,
        "active": true,
        "character": "Dictionary object (256)"
    },
    {
        "character_id": 260,
        "user_id": 1,
        "active": true,
        "character": "Dictionary object (260)"
    }
]

它没有给我我想要的实际项目,而是给了我一个字典对象。这几乎是正确的,但是我猜我在查询或序列化程序中配置了错误,从而阻止了我获取原始值。

我如何在这里获得实际值,而不是“字典对象(260)”?

字符模型:

class Char(models.Model):
    character = models.ForeignKey(
        Dictionary, on_delete=models.CASCADE)
    user = models.ForeignKey(
        User, on_delete=models.CASCADE)
    active = models.BooleanField()

字典型号:

class Dictionary(models.Model):
    traditional = models.CharField(max_length=50)
    simplified = models.CharField(max_length=50)
    pinyin_numbers = models.CharField(max_length=50)
    pinyin_marks = models.CharField(max_length=50)
    translation = models.TextField()
    level = models.IntegerField()

    class Meta:
        db_table = 'dictionary'

标签: pythondjangodjango-rest-framework

解决方案


tredzko 的回答是正确的,但是你在评论框中问过you like to put several fields from dictionary into the serialized output,所以对于那部分你可以这样做,

Class DictionarySerializer(models.Model):
    class Meta:
        model = Dictionary
        fields = (....) # Your specified fields goes here

class CharacterSerializer(serializers.Serializer):
    character_id = serializers.IntegerField()
    user_id = serializers.IntegerField()
    active = serializers.BooleanField()
    character = DictionarySerializer() # simply add this

编辑:无需重写该create方法。


推荐阅读