Я хочу получить объекты с pk
, которые я отправляю через запрос, но мне нужен только один предмет из queryset
.
Я хочу, чтобы BatchLog
объекты были такими же, как batch_id
, и мой запрос возвращает несколько элементов в этом запросе. Я просто хочу одного из них, и неважно, какой именно.
def get_queryset(self):
return BatchLog.objects.filter(batch_id=self.kwargs["pk"])
Он возвращает pk
, но мне нужно QuerySet<[BatchLog, BatchLog]>
Как я могу достичь этого?
Спасибо.
разве нет способа получить QuerySet
, который обертывает один элемент?
: он может обернуть возможный элемент, но в коллекцию, а не как «внешнюю структуру».
Зачем нужен query_set()
? Метод get_object()
лучше подходит для одного объекта в DRF ViewSet.
@MichaelLindsay да, ты прав! но мне нужно вернуться get_object_or_404
и это дает мне MultipleObjectsReturned
ошибку. Я не могу получить там последний объект.
@BurakAkyalçın: вопрос скорее в том, подходит ли «подробный просмотр». Обычно имеет смысл возвращать сведения об элементе только в том случае, если мы можем (легко) сослаться на один объект. Просто возвращая «случайный», это выглядит как «втягивание» чего-то в подробное представление, которое по сути не является подробным представлением.
@WillemVanOnsem Я знаю, что есть некоторые проблемы с отношениями, но я не могу это исправить прямо сейчас, все, что мне нужно, это получить случайный элемент из этого запроса :)
Вы можете просто получить первый.
def get_queryset(self):
return BatchLog.objects.filter(batch_id=self.kwargs["pk"]).first()
def get_object(self):
queryset = self.get_queryset()
return get_object_or_404(queryset)
Это возвращает BatchLog, но мне нужен QuerySet<BatchLog>
Вы можете нарезать набор запросов таким образом, чтобы количество результатов ограничивалось одним, поэтому:
def get_queryset(self):
return BatchLog.objects.filter(batch_id=self.kwargs['pk'])[:1]
Если таким образом фильтр соответствует нескольким записям, он вернет QuerySet
, который будет содержать одну из этих записей, которая сама по себе не является первой/последней отредактированной/созданной, она может быть разной каждый раз, когда вы делаете запрос.
Если нет товаров, соответствующих фильтру, то это будет пустой QuerySet
.
Если использовать filter_backend
s, то вышеописанное не сработает, поэтому лучше не делать этого на get_querset
, а нарезать результат filter_queryset
:
class MyListAPIView(ListAPIView):
# …
def filter_queryset(self, *args, **kwargs):
return super().filter_queryset(*args, **kwargs)[:1]
Я получаю сообщение об ошибке после того, как попробовал это AssertionError: Невозможно отфильтровать запрос после того, как фрагмент был взят.
и это возвращает QuerySet<[BatchLog]>, возможно, это проблема
@BurakAkyalçın: это потому, что DRF будет использовать результат при вызове filter_queryset
, который делает Джанго. Можешь поделиться полным обзором?
QuerySet
— это всегда набор предметов. Это может быть один элемент, поэтомуQuerySet<[BatchLog]>
, но неQuerySet
, который обертывает один элемент.