Джанго объединяет разные столы - PullRequest
0 голосов
/ 09 июля 2019

Это то, что я получил в моделях

class SFE(models.Model):
snpid = models.ForeignKey(Snps, models.DO_NOTHING, db_column='SNPID', primary_key=True)  # Field name made lowercase.
elementid = models.ForeignKey(Functionalelement, models.DO_NOTHING, db_column='ElementID')  # Field name made lowercase.
celllineid = models.ForeignKey(Celllines, models.DO_NOTHING, db_column='CELLLINEID')  # Field name made lowercase.
countexperiments = models.PositiveIntegerField(db_column='countExperiments')  # Field name made lowercase.
filetype = models.CharField(db_column='fileType', max_length=10)  # Field name made lowercase.

class Meta:
    managed = False
    db_table = 'SNPs_FunctionalElement'
    unique_together = (('snpid', 'elementid', 'celllineid', 'filetype'),)

def __str__(self):
    return str(str(self.snpid) + str(self.elementid) + str(self.celllineid) + str(self.filetype))

class Functionalelement(models.Model):
elementid = models.AutoField(db_column='ElementID', primary_key=True)  # Field name made lowercase.
name = models.CharField(unique=True, max_length=55)

class Meta:
    managed = False
    db_table = 'FunctionalElement'

def __str__(self):
    return str(self.elementid)

class Snps(models.Model):
snpid = models.AutoField(db_column='SNPID', primary_key=True)  # Field name made lowercase.
rsid = models.CharField(unique=True, max_length=20)
chrom = models.CharField(max_length=5)
pos = models.PositiveIntegerField()
ref = models.CharField(max_length=1)
alt = models.CharField(max_length=1)
maf1000genomes = models.FloatField(blank=True, null=True)
maftopmed = models.FloatField(db_column='mafTOPMed', blank=True, null=True)  # Field name made lowercase.

class Meta:
    managed = False
    db_table = 'SNPs'

def __str__(self):
    return str(self.snpid)

Теперь я хочу присоединиться к FunctionalElement с SFE, чтобы получить поле FunctionalElement.name с указанным конкретным SFE.snpid.

Я пытался с SFE.objects.select_related('elementid__name'), но я знаю, что это неправильно, и я не могу понять, как работать с django ORM

1 Ответ

0 голосов
/ 09 июля 2019

Чтобы получить простой объект, вам нужно сделать: a = SFE.objects.get(snpid=THE_SPECIFICSNPID) позже вы можете получить доступ ко всем связанным объектам, например: a.elementid.name вернет то, что вы хотите.Django ORM получает объект для вас, потому что «ленивая загрузка».Это означает, что если вам понадобится связанный объект позже, Django получит его для вас, конечно, ему нужно будет выполнить другой запрос, чтобы избежать необходимости вызывать метод select_related

Подводя итог: Чтобы получитьимя, которое вы можете сделать:

name = SFE.objects.get(snpid=THE_SPECIFICSNPID).select_related('elementid').elementid.name

Должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...