Объединение двух различных наборов запросов с условиями
У меня две разные модели:
class Material(models.Model):
line = models.ForeignKey('Line')
code = models.ForeignKey('Code')
quantity = models.FloatField()
class Inventory(models.Model):
code = models.ForeignKey('Code')
....
Я пытаюсь получить сумму по полю quantity
для каждой строки в Inventory, а также пытаюсь добавить к ней связанные поля line
. Вот что у меня есть:
line = Material.objects.all().values('code','line__line_id').annotate(Sum('quantity'))
# This gives me the SUM of quantity as required, output:
# <QuerySet [{'code': 'abc', 'line__line_id': 134, 'quantity__sum': 15.0},
# {'code': 'abcd', 'line__line_id': 134, 'quantity__sum': 5.0}]>
query_set = Inventory.objects.all().annotate(line=Value(F('line__line__line_id'), output_field=CharField())).order_by('code')
filter = self.filterset_class(self.request.GET, query_set)
В query_set
я получаю эту аннотацию line
в виде буквальной строки "F('line__line__line_id')". Как я могу сделать так, чтобы query_set
имел значения, отфильтрованные как: WHERE Inventory.code
== Material.code
?
По сути, я хочу объединить первый набор запросов со вторым, где code
одинаков в обоих наборах запросов. Я не хочу использовать метод chain(), так как мне нужно, чтобы это был объект QuerySet, чтобы я мог использовать FilterSet() из django-filters.
вы можете использовать подзапрос, в котором код == код обрабатывается через OuterRef https://docs.djangoproject.com/en/4.0/ref/models/expressions/#subquery-expressions