Как я могу изменить этот 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) по уникальному серийному номеру.
например,
=> после RUN запроса
Как изменить SQL-запрос на код ORM? как я могу изменить подзапрос на ORM?
Спасибо, что прочитали.
Думаю, это то, что вам нужно:
- Если нужно несколько связанных объектов
samples = Sample.objects.prefetch_related('process').group_by('serialinumber')
- Если вам нужны связанные объекты только для одного объекта
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')
)

