1

ユニコードを作成しようとしていますが、継承テーブルからフィールドを取得したいと考えています。このような:

 class EnvelopeBase(models.Model):
    name = models.CharField(
        max_length=50
        )
    ...........        

class Envelope(EnvelopeBase):
    category = models.ForeignKey(
        EnvelopeCategory, 
        blank=True, null=True
        )

    ........

    def __unicode__(self):
        return "{0}: {1}".format(self.category, self.name)

Envelope モデルでユニコードを作成していて、EnvelopeBase モデルからの「self.name」を取得しようとしていることに注意してください。エラーは発生しませんでしたが、出力は null です。ENvelopeBase モデルの名前フィールドに Envelope モデルにアクセスする方法は?

アップデート:

私がやろうとしているのは、たとえば次のようにカテゴリとエンベロープ名を表示することです:

カテゴリ = '貯蓄' と封筒 = 'メンテナンス' があるとします。

出力は次のようにする必要があります (Unicode 実装から):

 def __unicode__(self):
    //the self.name here return null
    return "{0}: {1}".format(self.category, self.name)

 Output: "Savings: maintenance"

しかし、私の問題は*貯蓄 (カテゴリ) *メンテナンス (封筒)が表示されないことだけです。self.name は、Envelope モデルにアクセスしようとしている EnvelopeBase モデルからのものです。

4

2 に答える 2

2

django モデルで継承を使用すると、親モデルと子モデル用に 2 つのテーブルが作成されます。親テーブルの対応する行を参照するための Parent_ptr_id という名前の外部キー列が子モデルに追加されます。

2 つのモデル (親と子) があるとします。

class Parent(models.Model):
    parent_field = models.CharField(max_length=50)
    def __unicode__(self):
        return self.parent_field

class Child(Parent):
    child_field = models.CharField(max_length=50)
    def __unicode__(self):
        return self.parent_field + ': ' + self.child_field

子モデルのインスタンスを作成するときは、parent_field も指定する必要があります。

child = Child(child_field='a', parent_field='b')

parent_field を指定しない場合、挿入される新しい親行の parent_field は null に設定されます。これは、データに発生した可能性があります。

また、子モデルのインスタンスを作成するときに、既存のparent_ptr_idを指定できます。

child = Child(child_field='c', parent_field='d', parent_ptr_id=1)

これにより、既存の親のparent_fieldが新しい値に更新されます。注意が必要なのは、ここでparent_fieldを指定しないと、既存の親行のparent_fieldがnullに更新されることです。これは、データにも発生している可能性があります。

それとは別に、既存のコードが機能するはずです。(私が知る限り、self.envelopebase.name は必要ありません)

于 2013-03-05T05:46:30.377 に答える
1

基本モデルを抽象化したいhttps://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

class EnvelopeBase(models.Model):
    name = models.CharField(
        max_length=50
    )

    ...........

    class Meta:
        abstract = True


class Envelope(EnvelopeBase):
    category = models.ForeignKey(
        EnvelopeCategory, 
        blank=True, null=True
    )

    ........

    def __unicode__(self):
        return "{0}: {1}".format(self.category, self.name)

もう 1 つの方法は、複数テーブルの継承ですhttps://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

基本的に、何もする必要はありません。Django は、2 つの間に 1 対 1 の関係を自動的に作成します。基本クラスのすべてのフィールドは親クラスで使用できますが、データは別のテーブルに存在します。

class EnvelopeBase(models.Model):
    name = models.CharField(
        max_length=50
    )

    ...........


class Envelope(EnvelopeBase):
    category = models.ForeignKey(
        EnvelopeCategory, 
        blank=True, null=True
    )

    ........

    def __unicode__(self):
        return "{0}: {1}".format(self.category, self.envelopebase.name)
于 2013-03-05T04:36:13.100 に答える