【问题标题】:DRF show ForeignKey field choicesDRF 显示 ForeignKey 字段选择
【发布时间】:2019-06-24 13:04:51
【问题描述】:

使用 Django Rest Framework 让前端用户了解 ForeignKey 字段选择的最佳方法是什么?在 Browsable API 中,这些字段有一个下拉小部件,其中包含所有现有对象作为选项。

自定义元数据类可以返回每个字段的可用选择,但如果有数百万个对象,请求可能会非常慢。

假设您有一个类似于下面的模型并且只有 5 个单元对象。您将如何列出单位选择?

class OrderLine(models.Model):
    order = models.ForeignKey(Order)
    product = models.ForeignKey(Product)
    unit = models.ForeignKey(Unit)

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

我最终实现了一个自定义元数据类,它根据序列化程序属性extra_choice_fields 向 OPTIONS 请求添加外键选择。通过这种方式,您可以选择在每个序列化程序上为哪些字段提供选项以及不包括哪些字段(例如,排除具有大量对象的字段)。

from rest_framework.metadata import SimpleMetadata
from rest_framework.relations import ManyRelatedField, RelatedField

from django.utils.encoding import force_text


class ChoicesMetadata(SimpleMetadata):

    def get_field_info(self, field):
        field_info = super().get_field_info(field)
        if (isinstance(field, (RelatedField, ManyRelatedField)) and
                field.field_name in getattr(field.parent.Meta, 'extra_choice_fields', [])):
            field_info['choices'] = [{
                'value': choice_value,
                'display_name': force_text(choice_name, strings_only=True)
            } for choice_value, choice_name in field.get_choices().items()]
        return field_info

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2021-04-28
    • 2010-12-13
    • 2017-04-19
    • 2021-07-13
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多