1

この (願わくは) 単純な問題を解決しようと、私は頭を悩ませています。

私は Django-nonrel を使用しており、いくつかのモデルをセットアップしようとしています。以下のコードを簡略化しました。

class Application(models.Model)
    name = "Application"

    def get_name(self):
        print(self.name)

class ExampleApp(Application)
    name = "Example Application"

class Site(models.Model)
    app = models.OneToOneField(Application, null=True)
    id  = models.CharField(max_length=1)
    # other details not important

のインスタンスを取得するときにSite、派生クラスのインスタンスを取得したい (例: ExampleApp)

class MyView(View):
    def get(self, request, *args, **kwargs):
        # Presuppose that I have an object with id="a"
        site = Site.objects.filter(id="a")

        #<Application: Application>
        app = site.app

        #returns "Application", not "Example Application"
        app.get_name()

派生クラスにアクセスするにはどうすればよいですか?

(理想的には、私はApplication抽象基底クラスになりたいのですが、django は抽象基底クラスへの関係を許可しません。フィールドを内部Applicationで定義しますが、django-nonrel は複数テーブルの継承をサポートしていません。)

4

2 に答える 2

2

これは、追加の Django プラグインなしでは不可能です。django の親クラスのオブジェクトから子クラスのオブジェクトを検索するを参照してください。ここで、lazerscience による回答では、https://code.google.com/p/django-polymorphic-models/を使用してこの機能にアクセスすることが提案されています。

于 2012-05-22T18:37:57.183 に答える
1

Furbeenatorが答えたのは正しいですが、私の(自己)答えは私の状況の誰にとってもより価値があると思います。

Django-nonrel注目すべきいくつかの素晴らしいアプリが含まれていますdjangotoolbox。に含まれてdjangotoolboxいるのは、特定のフィールドですEmbeddedModelField。モデルのコピーを「コンテナ」モデルのblobとして格納しているように見えます。

私の例では:

from djangotoolbox.fields import EmbeddedModelField

class Site(models.Model)
    app = EmbeddedModelField(null=True)
    id  = models.CharField(max_length=1)
    # other details not important

Applicationこれの利点は、私の状況では、クラスを抽象化できることも意味していました。Site欠点は、データが複製され、インスタンスからインスタンスにアクセスできないことですApplication(ただし、私の場合、これは許容できるトレードオフでした)。

于 2012-05-23T17:43:35.857 に答える