gpt4 book ai didi

django - Django 中的 ModelForms,其中底层模型依赖于另一个模型(通过 OneToOneField)

转载 作者:行者123 更新时间:2023-12-04 19:49:03 26 4
gpt4 key购买 nike

我的 Django 应用程序中有两个模型,用于存储用于某些同源搜索程序的搜索参数:

# models.py
class Search(models.Model):
"""A class to represent search runs."""

program = models.CharField(max_length=20)
results_file = models.FileField(
upload_to=(SEARCH_RESULTS_DIR)
)
timestamp = models.DateTimeField()

def __unicode__(self):
return u'%s %s' % (self.program, self.timestamp)


class FastaRun(models.Model):

search = models.OneToOneField('Search', primary_key=True)
# the user-input FASTA formatted protein sequence
query_seq = models.TextField()
# -b "Number of sequence scores to be shown on output."
number_sequences = models.PositiveIntegerField(blank=True)
# -E "Limit the number of scores and alignments shown based on the
# expected number of scores." Overrides the expectation value.
highest_e_value = models.FloatField(default=10.0,
blank=True)
# -F "Limit the number of scores and alignments shown based on the
# expected number of scores." Sets the highest E-value shown.
lowest_e_value = models.FloatField(blank=True)
mfoptions = [
('P250', 'PAM250'),
('P120', 'PAM120'),
('BL50', 'BLOSUM50'),
('BL62', 'BLOSUM62'),
('BL80', 'BLOSUM80')
]
matrix_file = models.CharField(
max_length=4,
choices=mfoptions,
default='BL50'
)
database_option = models.CharField(
max_length=25,
choices=BLAST_DBS,
default=INITIAL_DB_CHOICE
)
ktupoptions = [(1, 1), (2, 2)]
ktup = models.PositiveIntegerField(
choices=ktupoptions,
default=2,
blank=True
)

注意这里 FastaRun是一种 Search . FastaRun扩展搜索,因为为 FastaRun 定义了更多参数.一个 FastaRun必须有 Search它链接到的实例,以及这个 Search instance 是 FastaRun 的主键.

我有一个 ModelFormFastaRun类(class)。
# views.py
class FastaForm(forms.ModelForm):

class Meta:
model = models.FastaRun

我有一个 View 函数,我需要用它来填充 FastaForm并保存一个新的 Search实例和一个新的 FastaRun基于用户提交的表单的实例。该表格不包括选择 Search 的选项。实例。这是不可能的,因为 Search实例只能在用户实际提交此搜索时存在。

以下是该功能需要做什么的概述:
# also in views.py
def fasta(request, ...):
# populate a FastaForm from the information POSTed by the user--but
# how to do this when there's no Search information coming in from
# the user's request. We need to create that Search instance, too,
# but we also have to...

# validate the FastaForm
# ... before we can ...

# create a Search instance and save() it

# use this saved Search instance and give it to the FastaForm [how?]

# save() the FastaForm [save the world]

pass

因为 SearchFastaRun (因此 FastaForm )是
交织在一起,我觉得我进入了第 22 条军规。我需要
保存一个 Search实例,其参数存储在 POST
请求,但必须使用 FastaForm 验证其参数的
验证。但是,我认为 FastaForm直到不能被实例化
我已经实例化了一个 Search实例。但是,我无法实例化 Search实例,直到我使用 FastaForm 进行验证... 你得到
这个想法。

我在这里缺少什么?必须有一种相当干净的方法来做到这一点,但是
我看不清楚。

另外,如果我错了,请纠正我,但是当您在模型之间存在某种关系时(例如,也适用于 ForeignKeyManyToMany 字段),任何时候都可能发生这种相同的依赖情况。因此,肯定有人想通了这一点。

最佳答案

在这种情况下,我会使用继承来解决这个问题:

# models.py
class Search(models.Model):
"""A class to represent search runs."""
...

class FastaRun(Search):
# one-to-one field has been removed
....

现在,实例化一个 FastaRun根据定义也是实例化 Search . Django 也通过为 FastaRun 设置一个单独的表来正确处理数据库端。用 key 进入 Search .您的验证应该按预期与表单一起工作。如果您要对 Search 进行任何查询,您可能想要添加的唯一内容对象将是向 Search 添加一个类型字段那是被所有子类覆盖的,因此您可以过滤掉这些结果。

关于django - Django 中的 ModelForms,其中底层模型依赖于另一个模型(通过 OneToOneField),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/831410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com