在rest_framework的相关字段

时间:2016-02-22 21:59:04

标签: python django api django-rest-framework http-options-method

我正在使用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

2 个答案:

答案 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

您可以将自定义元数据类添加到导致问题的视图中。