ModelForms في جانغو حيث يعتمد النموذج الأساسي في نموذج آخر (عبر OneToOneField)
-
06-07-2019 - |
سؤال
ولقد اثنين من النماذج في تطبيق جانغو بلدي، لأغراض تخزين المعلمات البحث المستخدمة لبعض برامج البحث التماثل:
# 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
هو المفتاح الأساسي للFastaRun
.
ولدي ModelForm
للطبقة FastaRun
.
# views.py
class FastaForm(forms.ModelForm):
class Meta:
model = models.FastaRun
ولدي وظيفة الرأي الذي أنا بحاجة إلى استخدام لتجميع وحفظ 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
ولأن Search
وFastaRun
(وبالتالي FastaForm
) هي
تتشابك، وأنا أشعر أنني الدخول في كاتش 22. أنا بحاجة ل
حفظ مثيل Search
، التي يتم تخزينها في وظيفة المعلمات
طلب، ولكن الذي يجب التحقق من صحة استخدام في FastaForm
المعلمات
التحقق من الصحة. ومع ذلك، أعتقد أن FastaForm
لا يمكن إنشاء مثيل حتى
لقد مثيل مثيل Search
. ومع ذلك، وأنا لا أستطيع مثيل
المثال Search
حتى لقد تحقق باستخدام FastaForm
... يمكنك الحصول على
هذه الفكرة.
وماذا أنا في عداد المفقودين هنا؟ يجب أن تكون هناك وسيلة نظيفة إلى حد ما للقيام بذلك، ولكن I تفتقر إلى الوضوح لرؤيتها.
وأيضا، تصحيح لي إذا كنت مخطئا، ولكن هذا الوضع الاعتماد على نفسه يمكن أن يحدث في أي وقت لديك نوعا من العلاقة بين النماذج (على سبيل المثال، وأيضا لForeignKey
وManyToMany
الحقول). وبالتالي، هو شخص برزت بالتأكيد من ذلك.
المحلول
وهذه هي الحالة التي يكون فيها وأود أن استخدام الميراث لرعاية هذا:
# models.py
class Search(models.Model):
"""A class to represent search runs."""
...
class FastaRun(Search):
# one-to-one field has been removed
....
والآن، instantiating على FastaRun
هو بالتعريف instantiating أيضا Search
. جانغو يعالج الجانب قاعدة بيانات من هذا صحيح، أيضا، من خلال إنشاء جدول منفصل لFastaRun
مع مفتاح إلى Search
. يجب أن تعمل التحقق من الصحة كما هو متوقع مع النموذج. الشيء الوحيد الذي قد ترغب في إضافة إذا كنت تنوي القيام به أي استفسار على الكائن Search
سيكون إضافة حقل نوع إلى Search
هذا هو تجاوز من قبل جميع الفئات الفرعية، حتى تتمكن من تصفية هذه النتائج.