[英]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.