繁体   English   中英

在 Django 中填充我的多对多关系

[英]populate my many-to-many relation in Django

我是Django和Python的新人。我的研究项目中有三个模型:

模型.py

class Protein(models.Model):
    protein_id = models.CharField(
        max_length=256, null=False, blank=False, db_index=True)
    taxonomy = models.ForeignKey(
        Taxonomy, on_delete=models.DO_NOTHING, null=True, blank=True)
    length = models.IntegerField(null=True, blank=True)
    access = models.IntegerField(null=False, blank=False, default=0)

    def __str__(self):
        return self.protein_id

class Pfam(models.Model):
    domain_id = models.CharField(
        max_length=256, null=False, blank=False, db_index=True)
    domain_description = models.CharField(
        max_length=256, null=True, blank=True)

    def __str__(self):
        return self.domain_id

class Domain(models.Model):
    pfam = models.ForeignKey(Pfam, on_delete=models.CASCADE)
    description = models.CharField(max_length=256, null=True, blank=True)
    start = models.IntegerField(null=True, blank=True)
    stop = models.IntegerField(null=True, blank=True)
    protein = models.ManyToManyField(
        Protein, related_name='domains', through='ProteinDomainLink')

    def __str__(self):
        return self.pfam.domain_id

class ProteinDomainLink(models.Model):
    protein = models.ForeignKey(Protein, on_delete=models.DO_NOTHING)
    domain = models.ForeignKey(Domain, on_delete=models.DO_NOTHING)

Class 域有 ManyToMany 字段,通过 class ProteinDomainLink 链接到 class Protein。

从三个 csv 文件中检索数据,我的填充脚本如下所示:

填充_data.py

data_sequences_file = '../..source_file_1';
pfam_descriptions_file = '../..source_file_2';
data_set_file = '../..source_file_3';

pfam = defaultdict(list)
domains = defaultdict(list)
proteins = defaultdict(list)

... 

with open(pfam_descriptions_file) as pfam_descriptions_csv_file:
    pfam_descriptions_csv_reader = csv.reader(
        pfam_descriptions_csv_file, delimiter=',')
    for row in pfam_descriptions_csv_reader:
        pfam[row[0]]=row[1:2]

with open(data_set_file) as data_set_csv_file:
    data_set_csv_reader = csv.reader(data_set_csv_file, delimiter=',')
    for row in data_set_csv_reader:
        domains[row[5]] = row[4:5]+row[6:8]
        proteins[row[0].strip()] = row[1:2]+row[8:9]

pfam_rows = {}
domain_rows = {}
proteins_rows = {}

...

for domain_id, entry in pfam.items():
    row = Pfam.objects.create(
        domain_id=domain_id,
        domain_description=entry[0]
    )
    row.save()
    pfam_rows[domain_id] = row

for protein_id, entry in proteins.items():
    row, created = Protein.objects.get_or_create(
        protein_id=protein_id,
        taxonomy=taxonomy_rows[entry[0]],
        length=entry[1],
    )
    row.save()
    proteins_rows[protein_id] = row

#That's my question:

for protein_id, domain_id, entry in domains.items():
    row = Domain.objects.create(
        pfam=pfam_rows[domain_id],
        description=entry[1],
        start=entry[2],
        stop=entry[3]
    )
    row.protein.add(proteins_rows[protein_id])
    row.save()

我把代码留在了我没问题的地方。 我的问题涉及最后一个块,我在其中创建域表并将蛋白质行添加到链接表,在我的例子中我得到了一个错误:

对于 protein_id、domain_id、domains.items() 中的条目:ValueError:没有足够的值来解压(预期 3,得到 2)。

我尝试为我的域使用字典。 像这样:

domains = defaultdict(dict)

并像这样构造字典:

domains[row[0].strip()][row[5]] = row[4:5]+row[6:8],

但它也不起作用。

您得到的错误与 Django ORM 无关,它是由于试图将两个值解包为三个变量引起的:

for protein_id, domain_id, entry in domains.items():

domains.items()(key, list_of_something)对的集合,必须在两个变量中解包,例如:

for protein_id, entry in domains.items():

如果需要,可以在嵌套循环中迭代entry列表:

# 'entry' is not a great name here. Using it just for consistency with the original code
for protein_id, entry in domains.items():
    for item in entry:
        <do_something>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM