Как вернуть все связанные несколько элементов из модели Django с помощью набора запросов? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть данные, подобные показанным ниже, идентификаторы белков в первом столбце, пептидная последовательность второго столбца и некоторое значение в третьем столбце. Я создал модель Django для хранения этих данных.

Таблица данных:

A0A075B6K4  YELTQPPSVSTAR   60,10
A0A075B6K4  SYELTQPPSVTAR   2
A0A075B6Q5  EVQLVESGEGSLR   7
A0A075B6S5  DIQMTQSPSGDR    10
A0A0A0MRZ8  EIVLTQSPGER 30,20
A0A0B4J1V0  EVQLVESGGSLR    10
A0A0B4J1X5  EVQLVESGGSLR    0
A0A0B4J2D9  AIQLTQSPSGDR    0
A0A0C4DH42  EVQLVESGGSLR    0
A0A0C4DH55  EIVMTQSPGER 10
A0A0C4DH42  YELTQPPSTAR 20
A0A0C4DH55  YELTQPPSTAR 4
A0A0B4J1X5  YELTQPPSTAR 12

Django модели:

from django.db import models

# Create your models here.


class ProteinID(models.Model):
    ProtID = models.CharField(max_length=30)

    def __str__(self):
        return "%s" % (self.ProtID)

class PeptideSeq(models.Model):
    sequence = models.CharField(max_length=100)
    feq = models.CharField(max_length=100)
    protein = models.ForeignKey(ProteinID, on_delete=models.CASCADE)

    def __str__(self):
        return "%s %s" % (self.sequence, self.feq)

    class Meta:
        ordering = ['sequence']

Подробности:

Как видим в таблице один идентификатор белка может содержать более одной пептидной последовательности, а один пептид может быть связан с более чем одним идентификатором белка.

Я хочу добавить два варианта поиска:

  1. если идентификатор белка введен как запрос, он должен вернуть все связанные пептиды и значения из третьего столбца

Запрос A0A0C4DH55 должен вернуть

YELTQPPSTAR 4
EIVMTQSPGER 10
Или пептидная последовательность, введенная в качестве запроса, она должна возвращать все связанные идентификаторы белка и значения из третьего столбца.

Запрос EVQLVESGGSLR должен вернуть

A0A0B4J1V0 10
A0A0B4J1X5 0
A0A0C4DH42 0

Как это реализовать?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 мая 2020

1. ProteinID.objects.get(id='A0A0C4DH55').peptideseq_set.all()

2. PeptideSeq.objects.filter(sequence='EVQLVESGGSLR').values('protein__ProtID', feq)

1 голос
/ 28 мая 2020

Вместо того, чтобы делать proteinID внешним ключом в вашей модели пептида, установите sh взаимосвязь «многие ко многим» между моделями белка и пептида. Таким образом, белок будет иметь несколько пептидов, а пептид может принадлежать многим белкам.

Вы можете получить все пептиды, связанные с таким белком

protein = ProteinID.objects.get(ProtID=1)
peptides = protein.peptide_set.all()

Таким же образом вы можете получить белок синусоидального пептида.

https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/

...