首页 > 解决方案 > 在 API 响应中附加服务器名称——Django rest 框架

问题描述

我一直在尝试使用 Django restframework 创建一个 API。

API 中有一个 Image 字段,它给出了一个相对路径。我想在图像字段之前附加服务器的绝对路径或名称。

但它抛出一个错误TypeError: string indices must be integers

我相信我从有序 dict 创建的 json 是一个字符串,并且没有给出预期的输出。

问题:我需要访问 json 密钥并在其中附加服务器名称。我为此尝试了以下方法。

视图.py

def get_individualmember_details(request):
    if request.method == 'GET':
        serializer = MasterIndividualMembersSerializer(MasterIndividualMembers.objects.all(), many=True)
        result = json.dumps(serializer.data)
        print(result)
        for row in result:
            if row["member_photos"]["image"]:
                row["member_photos"]["image"] = request.META['HTTP_HOST'] + "/" + row["member_photos"]["image"]
        result = json.dumps(result)
        return JsonResponse(json.loads(result), safe=False)

预期输出:

[
    {
        "individualmemberId": "1",
        "member_photos": [
            {
                "id": 25,
                "image": "http://127.0.0.1:8000/individualmemberphotos/user.jpeg",   // need to append servername here
                "individualmemberId": "1"
            }
        ],
...
...
]

没有上述逻辑的电流输出:

[
    {
        "individualmemberId": "1",
        "member_photos": [
            {
                "id": 25,
                "image": "individualmemberphotos/user.jpeg", 
                "individualmemberId": "1"
            }
        ],
...
...
]

序列化程序.py

class IndividualPhotosSerializer(serializers.ModelSerializer):
    class Meta:
        model = IndividualMemberPhotos
        fields = "__all__"


class MasterIndividualMembersSerializer(serializers.ModelSerializer):
    member_photos = IndividualPhotosSerializer(many=True)
    
    class Meta:
        model = MasterIndividualMembers
        fields = "__all__"

请建议如何在任何 json 键之前附加服务器名称或字符串。提前致谢!

标签: pythondjangodjango-rest-framework

解决方案


如果您希望为您的文件构建绝对 URL,请在实例化序列化程序时传递请求上下文。否则,文件 URL 是相对的。

context = {'request': request}
serializer = MasterIndividualMembersSerializer(
    MasterIndividualMembers.objects.all(),
    context=context,
    many=True)

推荐阅读