我正在使用django rest framework版本3.3.2。
我们在数百个不同的地方使用HyperlinkedRelatedField
,我的问题是,这会通过choices
继承RelatedField
方法,其执行以下操作:
class RelatedField(Field):
...
@property
def choices(self):
queryset = self.get_queryset()
if queryset is None:
# Ensure that field.choices returns something sensible
# even when accessed with a read-only field.
return {}
return OrderedDict([
(
six.text_type(self.to_representation(item)),
self.display_value(item)
)
for item in queryset
])
该查询集是与另一个表的关系,可以包含数十万行。对api的OPTIONS请求现在消耗所有可用内存,因为它尝试为关系的可用选择生成json响应。即使html_cutoff
选项将此数字截断为1000,问题仍然存在,因为查询集在被截止值限制之前已经被消耗了。
我正在寻找一种非侵入性的方法来禁用外键上的选择枚举。我想避免创建一个自定义字段类,如果可能的话,有没有办法通过其余的框架api来影响这种行为?我不需要在选项响应中看到choices
。
答案 0 :(得分:3)
在当前的DRF(v3.3.2)中有this problem,OPTIONS响应尝试评估'选择'对于外键。这是一个糟糕的想法,如果您的数据库中包含大量内容,则可浏览的API无法使用。
DRF维护者了解这一事实,there is a PR currently scheduled for the 3.4.0 release解决了这个问题。
在它上游修复之前,这是我的解决方法。 注意:要覆盖此行为,您需要在DEFAULT_METADATA_CLASS
的{{1}}选项下设置REST_FRAMEWORK
。
这有意不会禁用settings.py
和朋友的选择枚举,仅针对相关字段。
ChoiceField
答案 1 :(得分:0)
您可以使用Metadata API修改Django REST框架中任何OPTIONS
请求的内容。
这涉及定义您自己的元数据类 - 请参阅this documentation page。
您可以将自定义元数据类添加到导致问题的视图中。