Объединение двух различных наборов запросов с условиями

У меня две разные модели:

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

Вернуться на верх