2

私はDjangoにかなり単純なモデルを持っていますBook.

class Book(models.Model):
    name = models.CharField(max_length=255, default="")
    description = models.TextField(null=True, blank=True)
    creation_date = models.DateTimeField()

構造とデータは基本的に外部 API から取得されるため、それを独自のアプリに含めており、むしろ変更したくありません。

今、私は別の本の別のソースをプロジェクトに追加したいと思っていますが、ここで何が最善の解決策なのかよくわかりません.

2番目のモデルは次のとおりです。

class NextBook(models.Model):
    title = models.CharField(max_length=255, default="")
    long_description = models.TextField(null=True, blank=True)
    created = models.DateTimeField()

したがって、基本的なフィールドはありますが、名前が異なります。この 2 つをまとめるには、おそらく GenericForeignKey を持つ別のモデルを使用できます。

class BaseBook(models.Model):
    book_type = models.ForeignKey(ContentType)
    book_id = models.PositiveIntegerField()
    book_object = generic.GenericForeignKey('book_type', 'book_id')

しかし、たとえば機能しないため、すべての本を照会することはできませんBaseBook.objects.all().order_by('created')。確かに、基本モデルの日時フィールドを複製してから、タイトルなどを複製することもできますが、それは間違った方向だと思います。また、特定のモデルに触れたくない場合、継承は選択肢ではないようです。

モデル構造とデータベースクエリを大幅に混乱させずに、より多くのプロバイダーとすべてのオブジェクトのクエリを効率的に「プラグイン」できる設計パターンまたは何かを探しています。

4

1 に答える 1

0

あなたの質問には根本的な矛盾があります。与えられた本について、created異なるプロバイダーによって報告されたものは同じであると思いますか?

もしそうなら、なぜあなたはあなたのcreatedフィールドを作り、BaseBookそれによって注文することができないのですか?次に、creation_dateをから削除できますBook(または、触れたくない場合は無視してください)。

そうでない場合、そもそも(プロバイダーのエントリーではなく)をどのように注文しますcreatedか?

また、あなたがやろうとしていることは、MongoDBのようなフリースキーマデータベースの良い例のように聞こえます。そこで、本のドキュメントにプロバイダーエントリを直接埋め込んでから、「本の最初のプロバイダーエントリから作成された<code>」のような順序で注文できます。したがって、非正規化せずに自己完結型のプロバイダー文書を維持します。createdただし、すべてのプロバイダーに対して同じことを意味する必要があります。

于 2012-06-27T15:46:28.907 に答える