我相信应该有一种简单的方法来做到这一点,但我不知道。感谢一些帮助。
在这样的模型中:
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的查询不太清楚。
预先感谢, 菲利普。
答案 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