gpt4 book ai didi

python - 如何使用 SerializerMethodField 创建延迟字段?

转载 作者:太空宇宙 更新时间:2023-11-03 20:30:00 25 4
gpt4 key购买 nike

我想使用 drf-flexfields 在模型序列化器中创建延迟方法字段。

我正在使用 Django Rest Framework 和 drf-flexfields。我想在模型序列化器中创建一个方法字段来进行复杂的查询。因为检索该字段会产生额外的数据库查找,所以我希望这是一个延迟字段,即只有在客户端明确要求时才会检索它。

DRF-Flexfields 文档似乎推断,可以通过仅在“expanded_fields”中列出字段而不是在正常的“fields”列表中来推迟字段,但没有给出进一步的解释或示例。 https://github.com/rsinger86/drf-flex-fields#deferred-fields

我尝试创建一个简单的 SerializerMethodField 来测试这一点:

class Phase(models.Model):
name = models.CharField(max_length=100)
assigned = models.ManyToManyField(settings.AUTH_USER_MODEL,
blank=True,
related_name="phases_assigned")


class PhaseSerializer(FlexFieldsModelSerializer):
assignable_users = serializers.SerializerMethodField("get_assignable_users")

expandable_fields = {
'assignable_users': (UserSerializer, {'source': 'assignable_users', 'many': True}),
}

class Meta:
model = Phase
fields = ['name', 'assigned']

def get_assignable_users(self, phase):
return {'test': 'this is a deferred field. It should only shows up when /?expand=assigned_users is given in '
'the api get request url'}

我收到以下错误:

“字段‘assignable_users’已在序列化器 PhaseSerializer 上声明,但尚未包含在‘fields’选项中。”

期望的结果是对/phase/处的 api 的调用将仅返回元“字段”列表中指定的默认字段。仅当客户端通过/phase/?expand=assignable_users 特别要求时,才会返回“assignable_users”。

实现这一目标的正确方法是什么?

最佳答案

无论是 SerializerMethodField,您都应该在 Meta 字段中添加您的 assignable_users 字段:

class PhaseSerializer(FlexFieldsModelSerializer):
...

class Meta:
model = Phase
fields = ['name', 'assigned', 'assignable_users']
# _____________________________^

检查the docs了解更多信息。

关于python - 如何使用 SerializerMethodField 创建延迟字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57565756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com