我认为这很简单,可能是重复的,但我无法通过查看文档来弄明白。
我有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
属性成为字典:我希望它是一个字符串。)
如何更改此信息?我无法解决这个问题。
答案 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')