Как я могу изменить этот SQL на код Django ORM?

select *
from sample
join process
on sample.processid = process.id
where (processid) in (
    select max(processid) as processid
    from main_sample
    group by serialnumber
) 
ORDER BY sample.create_at desc;

models.py

class Sample(models.Model):
    processid = models.IntegerField(default=0) 
    serialnumber = models.CharField(max_length=256)  ##


class Process(models.Model):
    sample = models.ForeignKey(Sample, blank=False, null=True, on_delete=models.SET_NULL)

Здравствуйте, у меня есть две модели и мне нужно изменить этот SQL запрос на Django ORM, код Python.

Мне нужно получить последнюю пробу (по processid) по уникальному серийному номеру.

например,

enter image description here

=> после RUN запроса

enter image description here

Как изменить SQL-запрос на код ORM? как я могу изменить подзапрос на ORM?

Спасибо, что прочитали.

Думаю, это то, что вам нужно:

  1. Если нужно несколько связанных объектов
samples = Sample.objects.prefetch_related('process').group_by('serialinumber')
  1. Если вам нужны связанные объекты только для одного объекта
samples = Sample.objects.filter(id=1).select_related('process').group_by('serialinumber')

При использовании PostgreSQL вы можете передать поля в distinct для получения единственного результата по определенному столбцу, это возвращает первый результат, поэтому в сочетании с упорядочиванием сделает то, что вам нужно

Sample.objects.order_by('serialnumber', '-processid').distinct('serialnumber')

Если вы не используете PostgreSQL. Используйте запрос values к столбцу, который должен быть уникальным, а затем аннотируйте набор запросов условием, которое должно группировать значения, Max в данном случае

from django.db.models import Max
Sample.objects.order_by(
    'serialnumber'
).values(
    'serialnumber'
).annotate(
    max_processid=Max('processid')
)
Вернуться на верх