在 Response 中将上下文数据传递到哪里(Django)

问题描述 投票:0回答:1

我想知道如何在 Django 中传递一些上下文数据来响应。

我有这个端点:

/api/facebook/user/

返回这样的数据:

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "facebook_account_id": "176890406129409",
        "first_name": "Ivan",
        "last_name": "K",
        "token_status": "active",
        "facebook_access_token": 1
    },
    {
        "facebook_account_id": "123123123",
        "first_name": "Ivan",
        "last_name": "FFFF",
        "token_status": null,
        "facebook_access_token": null
    },
    {
        "facebook_account_id": "123123",
        "first_name": "Test",
        "last_name": "test",
        "token_status": null,
        "facebook_access_token": null
    }
]

这是我的列表序列化器:

class FacebookUserListSerializer(ModelSerializer):
    token_status = SerializerMethodField()

    class Meta:
        model = FacebookUser
        fields = ["facebook_account_id", "first_name", "last_name", "token_status", "facebook_access_token"]

    def get_token_status(self, obj):
        try:
            facebook_token = obj.facebook_access_token
            if facebook_token:
                return "active" if facebook_token.is_active else "inactive"
        except FacebookToken.DoesNotExist:
            return None

这是我的列表视图:

def list(self, request, *args, **kwargs):
    response = super().list(request, *args, **kwargs)
    data = response.data
    inactive_accounts = sum(1 for account in data if account.get("token_status") == "inactive")
    accounts_without_token = sum(1 for account in data if account.get("token_status") is None)
    context = {"inactive_accounts": inactive_accounts, "accounts_without_token": accounts_without_token} # Is this the correct way of passing context data to a response?
    response.context_data = context
    return response

在列表视图中,在“上下文”变量中,我试图将数据传递到前端,但我确信我这样做是错误的,我必须首先将其转换为 JSON,或者将其放在其他地方。

所以问题是 - 在哪里(序列化器、列表方法或其他地方?)以及我应该如何根据 REST 约定放置此 context 数据,以便可以在前端访问数据而无需迭代列表项?

django rest django-rest-framework response
1个回答
0
投票

你可以这样做:

context = {
            "inactive_accounts": inactive_accounts,
            "accounts_without_token": accounts_without_token
        }

response['context'] = context

但在前端,您必须使用链式密钥来获取这些值,例如

data.context.inactive_accounts

或者您可以直接将密钥添加到响应中,而无需定义单独的上下文。

response['inactive_accounts']= inactive_accounts
response['accounts_without_token']= accounts_without_token

然后在前端你可以直接用相关的key来获取

data.inactive_accounts

data
是您在前端定义的变量名称并存储 api 调用的响应

© www.soinside.com 2019 - 2024. All rights reserved.