DRF显示ForeignKey字段选择

时间:2019-06-24 13:04:51

标签: django django-rest-framework

使用Django Rest框架让前端用户了解ForeignKey字段选择的最佳方法是什么?在Browsable API中,这些字段具有一个下拉窗口小部件,其中所有现有对象都可以作为选择。

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

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

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

1 个答案:

答案 0 :(得分:0)

我最终实现了一个自定义元数据类,该类基于序列化程序属性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