ModelForms في جانغو حيث يعتمد النموذج الأساسي في نموذج آخر (عبر OneToOneField)

StackOverflow https://stackoverflow.com/questions/831410

سؤال

ولقد اثنين من النماذج في تطبيق جانغو بلدي، لأغراض تخزين المعلمات البحث المستخدمة لبعض برامج البحث التماثل:

# 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 هذا هو تجاوز من قبل جميع الفئات الفرعية، حتى تتمكن من تصفية هذه النتائج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top