Как я могу изменить этот запрос в 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

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