4

Google の AppEngine で実行されている django-nonrel プロジェクトに取り組んでいます。ゲーム時間、ステータス、場所など、すべてのスポーツに一般的に共通する詳細を含むゲームのモデルを作成したいと考えています。その後、GameBasketball、GameBaseball などの特定のクラスをモデル化し、これらは基本クラスから継承します。

ただし、特定の日のすべてのゲームのようなものを取得したい場合、これは問題を引き起こします。

Game.objects.filter(gametime=mydate)

これはエラーを返します:

DatabaseError: Multi-table inheritance is not supported by non-relational DBs.

AppEngine が JOIN をサポートしていないことを理解しているため、これが失敗するのは理にかなっています。しかし、非リレーショナル環境でこの問題に適切に取り組む方法がわかりません。私が試した解決策の 1 つは、ゲームを抽象基本クラスに変換することです。これにより、データを適切にモデル化できますが、抽象のオブジェクトを取得できないため、上記のユース ケースは解決されません。基本クラス。

Game モデルにすべての可能なスポーツのすべてのデータを配置する (特定のスポーツに関連しないフィールドを null のままにする) 唯一の解決策はありますか、それともこの問題を解決するよりエレガントな方法はありますか?

編集:特にAppEngineではなく、noSQLセットアップでこのタイプの問題を処理する正しい方法を理解することにもっと興味があります。ですから、答えが GAE 固有のものでなくても、遠慮なく返信してください!

4

2 に答える 2

1

将来この問題を抱えている他の人のために、私が最終的にどのように解決したかを以下に示します. これはややmongo固有の解決策であり、ベースの非relクラスを使用するだけでこれを解決する簡単な方法はないことに注意してください。

Mongoの場合、埋め込みドキュメントを使用してこれを解決できます(他のnoSQLセットアップには同様のソフトスキーマタイプの機能がある場合があります)、以下の単純化されたコード:

class Game(models.Model):
    gametime = models.DateTimeField()
    # etc

    details = EmbeddedModelField() # This is the mongo specific bit.

class GameBasketballDetails(models.Model):
    home = models.ForeignKey(Team)
    # etc

ここで、Game クラスをインスタンス化するときに、詳細フィールドに GameBasketballDetails オブジェクトを保存します。だから私は今できる:

games = Game.objects.filter(gametime=mydate)
games[0].details.basketball_specific_method()

これは、Game モデルに対してクエリを実行しながら、必要な「子」固有の情報を取得できるため、許容できるソリューションです。

于 2012-06-21T02:34:54.350 に答える
0

django-nonrel で複数テーブルの継承が許可されていない理由は、ご存知のように、Django がこの種のモデルに提供する API が JOIN クエリを頻繁に使用するためです。

しかし、Django がモデルの継承 'sugar' で行っていたのと同じことを手動で設定し、独自のコードで結合を行うことを避けることができると思います。

例えば

class Game(models.Model):
    gametime = models.DateTimeField()
    # etc

class GameBasketball(models.Model):
    game = models.OneToOneField(Game)
    basketball_specific_field = models.TextField()

GameBasketballnewを作成して対応するインスタンスも作成するときは、少し余分な作業が必要になりGameます (カスタム マネージャー クラスを試すことができます)。

qs = Game.objects.filter(gametime=mydate)
qs[0].gamebasketball.basketball_specific_field

django-nonrel と djangoappengine の新しいホームが GitHub にあります: https://github.com/django-nonrel/

GAE データストア API 自体の速度に加えて、Python フレームワークの選択が大きな違いを生んだり、django-nonrel が本質的に webapp2 よりも遅いとは確信していません。

于 2012-06-20T12:41:54.810 に答える