1

よし、挑戦だジャンゴニスタ!

私のプロジェクトには3種類のデータがあるとしましょう。

  • 計画
  • オーディオ
  • ビデオ

プロジェクトは、無制限の数の Video および Audio オブジェクトへの参照、および他の Projects への無制限の参照を持つことできます

これをモデル化する最良の方法は何ですか? 新しいオブジェクト タイプ (画像、リンク、匂いなど) を将来追加できるように、また複数のプロジェクトからオブジェクトを参照できるように、一般的な方法で行う必要があります。

これを行う方法について3つの理論があります。

#1: 継承

BaseModel クラスを作成し、他のすべてのオブジェクトがそこから継承されるようにします。

class BaseModel(models.Model)
class Project(BaseModel)
class Video(BaseModel)
etc

次に、Project クラス内のすべての BaseModel に ManyToMany フィールドを設定します。

class Project(BaseModel):
    content = models.ManyToManyField(BaseModel)

これは機能し、パフォーマンスが向上しますか?

#2: 一般的な外部キー

ContentTypes フレームワークを使用できる GenericForeignKey フィールドを使用するシステムをセットアップすることもできます。

content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')

(これはおそらく最悪の考えだと思います。)

#3: ジェネリック ManytoMany キー

最後に、オブジェクト間のすべての関係を保持する別のテーブルを作成できました。

class RelatedObject(models.Model):
    """
    A generic many-to-many implementation where diverse objects are related
    across a single model to other diverse objects -> using a dual GFK
    """
    # SOURCE OBJECT:
    parent_type = models.ForeignKey(ContentType, related_name="child_%(class)s")
    parent_id = models.IntegerField(db_index=True)
    parent = GenericForeignKey(ct_field="parent_type", fk_field="parent_id")

    # ACTUAL RELATED OBJECT:
    object_type = models.ForeignKey(ContentType, related_name="related_%(class)s")
    object_id = models.IntegerField(db_index=True)
    object = GenericForeignKey(ct_field="object_type", fk_field="object_id")

    alias = models.CharField(max_length=255, blank=True)
    creation_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ('-creation_date',)

    def __unicode__(self):
        return '%s related to %s ("%s")' % (self.parent, self.object, self.alias)

その後

class Project(models.Model):
    related = RelatedObjectsDescriptor()

これは、Charles Leifer によって詳細に説明されています: http://charlesleifer.com/blog/connecting-anything-to-anything-with-django/および彼の django-generic-m2m プロジェクト: https://github.com /coleifer/ジャンゴ-ジェネリック-m2m

何をすべきか?

では、リレーションシップを保存するためのこれらの各アプローチの長所と短所は何でしょうか? どちらが最速で、どちらが書きやすく、維持しやすいでしょうか? 過去にどのようなアプローチを使用してきましたか?

どうもありがとう!

4

1 に答える 1

0

モデルの'self'引数として使用したいと思います(例の継承を使用する代わりに)。これにより、自己参照モデルを定義できます。ProjectManyToManyField

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkeyを見ると、2 行下に次のメモがあります。

再帰的な関係 (それ自体と多対 1 の関係を持つオブジェクト) を作成するには、models.ForeignKey('self') を使用します。

... 2008 年のこのブログ エントリから初めてこのことを知りました (現在はいくつかの点で時代遅れになっている可能性がありますが、この手法を使用するときは今でも参照しています)。

http://eflorenzano.com/blog/2008/05/17/exploring-mixins-django-model-inheritance/

本当に、頑張ってください。

于 2013-02-19T02:24:00.707 に答える