Я использую версию django rest framework 3.3.2.Отключение выбора на Связанном объекте rest_framework
Мы используем 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
])
Это QuerySet есть отношение к другому столу, и могут содержать сотни из тысяч строк. Запрос OPTIONS на api теперь потребляет всю доступную память, поскольку он пытается сгенерировать ответ json для доступных вариантов отношения. Несмотря на то, что опция html_cutoff
обрезает это число до 1000, проблема остается, потому что набор запросов уже был использован до того, как он будет ограничен отсечением.
Я ищу неинтрузивный способ отключить перечисление вариантов по внешним ключам. Я хотел бы избежать создания настраиваемого класса полей, если это возможно, есть ли способ повлиять на это поведение через остальную структуру api? Мне вообще не нужно видеть choices
в ответе параметров.
Действительно, я рассматриваю пользовательский класс метаданных как возможно лучшее место для атаки этого. Но, похоже, нет подходящего метода для переопределения для него, последний шанс перед тем, как перейти к сериализатору, и поля находятся в 'get_field_info' (что делает много других важных вещей). – wim
@wim Я создал новый класс метаданных, который перегружает 'get_field_info'. Я начал с 'SimpleMetadata.get_field_info' в качестве шаблона. Я знаю, что это не супер чисто, но это единственный способ найти! – Kieran
Если вы используете 'SimpleMetadata.get_field_info', то вы уже потребляли запрос, так что это не хорошо .. – wim