使用Django Rest框架让前端用户了解ForeignKey字段选择的最佳方法是什么?在Browsable API中,这些字段具有一个下拉窗口小部件,其中所有现有对象都可以作为选择。
自定义元数据类可以返回每个字段的可用选择,但是如果有数百万个对象,则请求可能会非常缓慢。
假设您有一个与下面类似的模型,并且只有5个单位对象。您将如何列出单位选择?
class OrderLine(models.Model):
order = models.ForeignKey(Order)
product = models.ForeignKey(Product)
unit = models.ForeignKey(Unit)
答案 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