Как я могу изменить этот запрос в ORM?
Здравствуйте, у меня есть две такие модели,
class Sample(models.Model):
name = models.CharField(max_length=256) ##
processid = models.IntegerField(default=0) #
class Process(models.Model):
sample = models.ForeignKey(Sample, blank=False, null=True, on_delete=models.SET_NULL, related_name="process_set")
end_at = models.DateTimeField(null=True, blank=True)
и я хочу объединить модель Sample и модель Process. Потому что образец связан с процессом, и я хочу получить информацию о процессе с помощью образца .
SELECT sample.id, sample.name, process.endstat
FROM sample
INNER JOIN process
ON sample.processid = process.id
AND process.endstat = 1;
(я использую SQLite)
Я использовал
sample_list = sample_list.filter(process_set__endstat=1))
но он вернулся
SELECT sample.id, sample.name
FROM sample
INNER JOIN process
ON (sample.id = process.sample_id)
AND process.endstat = 1)
Это НЕ то, чего я хочу.
Как я могу решить эту проблему?
Это должно сработать для вас
Process.objects.filter(end_at=1).values('sample__id','sample__name','end_at')
.values() method returns selective table fields.
Я предполагаю sample_list = Sample.objects.
Когда вы фильтруете модель, выбираются только поля, определенные в модели. В вашем примере id and processid. Если вы хотите получить значения из связанных моделей в виде одной записи, вам нужно использовать values or values_list. Чтобы получить нужный запрос, нужно сделать следующее
sample_list = sample_list.filter(process_set__endstat=1).values('id', 'name', 'process__endstat')
Btw, Django делает JOIN на поле внешнего ключа. Таким образом, вы не можете получить ON sample.processid = process.id, поскольку processid не является полем ForeignKey.
Ссылка: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#values
Я нашел JOIN не на поле внешнего ключа в django.
sample_list = sample_list.filter(processid__in=Process.objects.filter(endstat=1)
Я использовал метод Django-queryset join without foreignkey