Django RestFramework возвращает только последний результат после фильтрации
В моем django проекте я использую DjangoRestFramework для выставления некоторых конечных точек API. Сейчас я пытаюсь показать только последний результат модели после фильтрации данных. Модели:
class VarsResults(models.Model):
id = models.AutoField(primary_key=True)
id_res = models.ForeignKey(Results, related_name="mainres", on_delete=models.CASCADE)
var_id = models.ForeignKey(ModbusVariable, null=True, on_delete=models.SET_NULL)
var_val = models.CharField(max_length=400, blank=True)
var_val_conv = models.CharField(max_length=100, blank=True, null=True)
base_byte_order = models.CharField(max_length=15)
var_hash = models.CharField(max_length=400)
serialyzers:
class VarsResultsSerializer(serializers.ModelSerializer):
id_res = ResultsSerializer(read_only=True)
var_id = ModvarSerializer(read_only=True)
class Meta:
model = VarsResults
fields = ['id', 'id_res', 'var_id', 'var_val', 'var_conv', 'var_hash']
views.py
class VarResultsListLast(generics.ListAPIView):
queryset = VarsResults.objects.using(random.choice(replica_list)).order_by('-id')[:1]
serializer_class = VarsResultsSerializer
pagination_class = StandardResultsSetPagination
# paginator = None
filter_backends = [DjangoFilterBackend]
filterset_fields = {
'id_res__id': ['exact'],
'id_res__device': ['exact'],
'id_res__unit__id': ['exact'],
'id_res__proj_code': ['exact'],
'var_id__var_group__short_name': ['exact'],
'id_res__read_date': ['gte', 'lte', 'exact', 'gt', 'lt']
}
search_fields = ['id_res__id', 'id_res__unit__id', 'id_res__device', 'id_res__proj_code', 'id_res__read_date']
ordering_fields = '__all__'
Я создаю свой набор запросов, используя .order_by('-id')[:1]
, чтобы иметь только последние результаты, но это работает только если я не использую никакого фильтра (возвращает последний результат для всей таблицы), если я пытаюсь фильтровать, например, используя proj_code или какой-либо другой фильтр, я хотел бы иметь в ответ только последний результат из отфильтрованных данных, но у меня есть:
(например: http://127.0.0.1:8000/api/results_data_last/?id_res__proj_code=CR00069)
AssertionError at /api/results_data_last/ Невозможно фильтровать запрос после того, как был сделан срез.
Как я могу выполнить мои параметры фильтрации и получить в ответ только последнюю запись (основанную на id моей модели)?
Заранее большое спасибо
Используя .last()
, вы можете получить последнюю запись. Подробно описано в документации
https://docs.djangoproject.com/en/3.2/ref/models/querysets/#last