DRF展示ForeignKey字段选择项

3

使用Django Rest框架,如何最好地告知前端用户ForeignKey字段的选择呢?在Browsable API中,这些字段有一个下拉小部件,其中包含所有现有对象作为选择项。

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

假设您有一个类似于下面的模型,并且只有5个unit对象。您将如何列出可用的unit选项呢?

Original Answer翻译成"最初的回答"

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

1
https://dev59.com/-2Qm5IYBdhLWcg3w2SD3#17293090 - undefined
1
@PetarP 如果有5个单元的对象存在,我想在前端显示所有5个对象的下拉菜单。您提供的链接仅适用于只读操作。 - undefined
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接