2012-01-24 7 views
0

インスタンス化された基本モデルクラスから派生したmodelclassインスタンスを取得したいと考えています。Django:複数のテーブル継承で、基本クラスの派生クラスにアクセスできない

私は以下のモデルのクラス階層があります。

class AlfrescoPFCModel(models.Model): 
    #some fields and methods 
    class Meta: 
     abstract = True 


class Contenido(AlfrescoPFCModel): 
    #some fields and methods 

class Proyecto(Contenido): 
    #some fields and methods 

class ProyectoCalificado(Proyecto): 
    #some fields and methods 

class ProyectoArchivado(ProyectoCalificado): 
    #some fields and methods 

をそして、私はこのようにPROYECTOクラスをインスタンス化:

proyecto = proyecto_form.save(commit=False) 
#do some stuff with some fields that dont appear on the form 
proyecto.save 

私はベースから派生したクラスProyectoCalificadoにアクセスしようとした別のビューで以前にデータベースにインスタンス化され、保存されたクラスProyecto:

pc = ProyectoCalificado.objects.get(pk=id) 

と私は取得:ProyectoCalificado一致するクエリが存在しません。

p = get_object_or_404(Proyecto, id=id) 
pc = p.proyectocalificado 

を、それは2行目に同じエラーを取得:

私も試してみました。 #multi-table-inheritance

私は何をしたいことは、増分このワークフロー次PROYECTO(プロジェクト)に関連するデータを完了することです:私はそれを行うために許されるべきドキュメントを読ん

PROYECTO - > ProyectoCalificado - > ProyectoArchivado 。 私は各ステップごとに3つの異なるフォームを持っています。一度にすべての必須フィールドを埋めることなくデータベースに保存する必要があるため、3つの異なるモデルが必要です。

ありがとうございます!

答えて

1

フォームウィザード(https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/)を使用します。

UPDATE

あなたは、あなたがデータベースレベルに空白またはNULL可能なモデルのフィールドを確認する必要があり、その後、唯一の各上のフィールドの要件を強制する、なぜならあなたが記述状況のフォームウィザードを使用できない場合個々のフォーム。それを作成するために必要な一回限りのフォームセットの目的のためだけに、3つのレベルの継承を作成することは、間違ったアプローチです。追加のテーブルにまたがってデータを断片化し、クエリをより複雑にし、長期的なメリットはありません。

たとえば、あたかも何もしないかのようにモデル自体を設定するか、または最初のフォームの項目のみが必要です。その後、最初のフォームでは、その特定のステージに必要なフィールドだけを必要とします。あなたは__init__をオーバーライドすることでこれを簡単に行うことができます

class FirstForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(FirstForm, self).__init__(*args, **kwargs) 

     self.fields['some_required_field'].required = True 
     # rinse and repeat 

は再び、その特定のフォームに必要必要とされる実際のフィールドになって、あなたの第二と第三のフォームで同じ操作を行います。

次に、1日に電話して飲み物をお持ちください。

+0

ありがとうございますが、フォームは異なる人によって異なる日に提出されるため、使用できません。 –

0

子インスタンスがある場合は、そのスーパークラスのインスタンスを指す<base class name>_ptrメンバーが必要です。子を取得するためにこれをfilterクエリの基礎として使用できます。

IDの割り当て方法に何も影響を与えていない場合は、基本クラスと派生クラスのインスタンスが同じidになると見なすこともできます。

+0

ありがとう!私は基本インスタンスを持っていますが、子供のものではありませんが、私はそれを仮定しますが、クエリpc = ProyectoCalificado.objects.get(pk = id)(IDは基本クラスのIDです)は何も取得しません –

関連する問題