Django Rest Framework - 返回反向外键属性?

时间:2015-04-08 22:25:13

标签: django-rest-framework

我认为这很简单,可能是重复的,但我无法通过查看文档来弄明白。

我有Django模型如下:

class Image(models.Model):
    manor = models.ForeignKey(Manor, related_name='image_for_manor')
    filename = models.CharField(max_length=30, null=True, blank=True)

class Manor(models.Model):
    id = models.IntegerField(primary_key=True)

我希望用户能够查询庄园并查看相关图片。我想要返回这个JSON:

{ 
   id: 572,
   image: 'my/filepath.png'
}

这是我的观点:

@api_view(['GET'])
def manor(request, id):
    mymanor = Manor.objects.get(id=id)
    serializer = ManorSerializer(mymanor)
    return JSONResponse(serializer.data)

这些是我的序列化器:

class ImageFilePathSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = ('filename',)

class ManorSerializer(serializers.ModelSerializer):
    image = ImageFilePathSerializer(source="image_for_manor")

    class Meta:
        model = Manor
        fields = ('id', 'image')

但是这不起作用:我得到image的空字典。 (即使它不是空的,我也意识到它不对,因为我不希望image属性成为字典:我希望它是一个字符串。)

如何更改此信息?我无法解决这个问题。

1 个答案:

答案 0 :(得分:2)

正如Kevin建议的那样,为什么不使用ImageField,它会为您提供上传图像的网址。虽然如果你不想这样做,你需要做一些改变来获得你想要的结果格式。(以下解决方案假设只有一个图像将用于一个未成年人)

views.py(为什么不是ImageFilePathSerializer而不是另一个,因为它还包含你想要的所有数据)

@api_view(['GET'])
def manor(request, id):
    mymanor = Image.objects.get(manor__id=id)
    serializer = ImageFilePathSerializer(mymanor)
    return Response(serializer.data)

serializers.py(在ImageFilePathSerializer中添加带文件名的Id)

class ImageFilePathSerializer(serializers.ModelSerializer):
    class Meta:
        model = Image
        fields = ('id', 'filename',)


class ManorSerializer(serializers.ModelSerializer):
    filename = serializers.ImageField(source="image_for_manor")

    class Meta:
        model = Manor
        fields = ('id', 'filename')