よし、挑戦だジャンゴニスタ!
私のプロジェクトには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
何をすべきか?
では、リレーションシップを保存するためのこれらの各アプローチの長所と短所は何でしょうか? どちらが最速で、どちらが書きやすく、維持しやすいでしょうか? 過去にどのようなアプローチを使用してきましたか?
どうもありがとう!