Django Rest框架。如何序列化模型名称和实例值,而不是content_type和object_id?

时间:2019-07-18 20:16:14

标签: django django-rest-framework

我相信应该有一种简单的方法来做到这一点,但我不知道。感谢一些帮助。

在这样的模型中:

class Item(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    def __str__(self):
        return str(self.content_type) + str(self.content_object)

我这样序列化了它:

class CaseDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'

哪个还给我:

[
    {
        "id": 1,
        "object_id": 35,
        "content_type": 29
    },
    {
        "id": 2,
        "object_id": 36,
        "content_type": 31
    }
]

我想要这样的东西:

[
    {
        "id": 1,
        "object_id": "A value from the instance such as name, instead of the ID",
        "content_type": "The name of the model, or even better, the verbose name"
    },
    {
        "id": 2,
        "object_id": "A value from the instance such as name, instead of the ID",
        "content_type": "The name of the model, or even better, the verbose name"
    }
]

SlugRelatedField似乎是前进的方向,但我可以使其工作。

将其添加到序列化程序是一个很好的进步。

content_type = serializers.SlugRelatedField(
        queryset=ContentType.objects.all(),
        slug_field='model')

但是,由于模型并不总是相同,因此我对object_id的查询不太清楚。

预先感谢, 菲利普。

1 个答案:

答案 0 :(得分:0)

您可以从属性content_object获取该信息,但是您必须在序列化程序上定义另外两个字段:

class CaseDetailSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()
    model = serializers.SerializerMethodField()

    class Meta:
        model = Item
        fields = ('content_type', 'object_id', 'name', 'model')

    def get_name(self, instance):
        try:
            return instance.content_object.name
        except:
            return None

    def get_model(self, instance):
        try:
            return instance.content_object.__class__.__name__
        except:
            return None