Перевести запрос SQL в хорошо сделанный QuerySet - PullRequest
1 голос
/ 29 мая 2020

У меня есть необработанный набор запросов, который я хочу перевести в QuerySet. Но я всегда получаю ошибку.

Вот необработанный запрос:

q = Table1.objects.raw(
     '''SELECT base_table1.id, base_table1.name, base_table1.n_id, count(base_table2.id) as 'count', max(base_table2.timestamp) as 'latest'
                                     FROM base_table1
                                     INNER JOIN base_table3 on base_table3.table1_id = base_table1.id
                                     INNER JOIN base_table2 on base_table2.table3_id = base_table3.id
                                     GROUP by base_table1.id'''

Примечание: здесь мне не нужен base_table1.id, но он требовался для rawQuerySet

Вот модели:

class Table1(models.Model):
n_id = models.PositiveIntegerField()
name = models.CharField(max_length=45)

class Table2(models.Model):
table3 = models.ForeignKey(
    Table3, null=True, blank=True, on_delete=models.SET_NULL
)
timestamp = models.DateTimeField(null=True)


class Table3(models.Model):
table1 = models.ForeignKey(
    Table1, null=True, related_name='t_entries', on_delete=models.SET_NULL
)

Заранее большое спасибо за ответы.

1 Ответ

1 голос
/ 29 мая 2020

Вы можете аннотировать модель Table1 с помощью:

from django.db.models import Max, Count

Table1.objects.annotate(
    count=Count('t_entries__table3'),
    latest=Max('t_entries__table3__timestamp')
)

Объекты Table1, которые возникают из этого набора запросов, будут иметь дополнительные атрибуты .count и .latest.

...