Логика SQL-запросов в Django ORM Логика запросов - PullRequest
0 голосов
/ 05 января 2019

Я пытался подумать о том, как следующий SQL-запрос будет структурирован как запрос Django ORM, но мне не повезло в моих многочисленных попытках. Кто-нибудь может помочь?

SELECT targets_genetarget.gene, count(targets_targetprediction.gene) as total FROM targets_genetarget LEFT OUTER JOIN targets_targetprediction on targets_targetprediction.gene = targets_genetarget.gene WHERE list_name LIKE %s GROUP BY targets_genetarget.gene

class GeneTarget(models.Model):
    list_name = models.CharField(max_length=100)
    gene = models.CharField(max_length=50)
    date_added = models.DateField(auto_now=True)

    class Meta:
        unique_together = (('list_name', 'gene'),)

    def __str__(self):
        return self.list_name


class TargetPrediction(models.Model):
    specimen_id = models.CharField(max_length=100)
    patient_peptide = models.ForeignKey(Peptide, on_delete=models.CASCADE, verbose_name="Peptide", related_name="predictions")
    allele = models.ForeignKey(Allele, on_delete=models.CASCADE, verbose_name="Allele", related_name="predictions")
    gene = models.CharField(max_length=50)

    class Meta:
        unique_together = (('specimen_id', 'patient_peptide', 'allele', 'gene'),)

    def get_absolute_url(self):
        return f'/samples/specid-{self.specimen_id}'

    def __str__(self):
        return (f'Specimen: {self.specimen_id} Peptide: {self.patient_peptide} Allele: {self.allele} Gene: {self.gene} ')

1 Ответ

0 голосов
/ 05 января 2019

Ничто не мешает вам объявить поле TargetPrediction.gene в качестве внешнего ключа с помощью атрибута to_field, поэтому вам вообще не нужно будет изменять данные:

class TargetPrediction(models.Model):
    ...
    gene = models.ForeignKey("GeneTarget",  to_field="gene")

Теперь ваш запрос просто становится:

GeneTarget.objects.filter(list_name="whatever").values("gene").annotate(total=Count("targetprediction"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...