あまりにも多くのことをやっているDjangoモデルがあります。ここにモデルの簡略化された例があります。基本的には、これは4種類の異なるタイプのEntity
を表すことができ、他のエンティティを指す再帰的なForeignKeyとManyToManyの関係があります。Djangoモデルを分割するとき、データ移行中にForeignKeyとManyToMany関係を保持する方法は?
このプロジェクトは現在Django 1.8.xとPython 2.7.xを使用していますが、解決策が必要な場合はアップグレードできます。
class Entity(models.Model):
"""
Films, People, Companies, Terms & Techniques
"""
class Meta:
ordering = ['name']
verbose_name_plural = 'entities'
# Types:
FILM = 'FILM'
PERSON = 'PERS'
COMPANY = 'COMP'
TERM = 'TERM'
TYPE_CHOICES = (
(FILM, 'Film'),
(PERSON, 'Person'),
(COMPANY, 'Company'),
(TERM, 'Term/Technique'),
)
created = models.DateTimeField(auto_now_add=True, auto_now=False)
updated = models.DateTimeField(auto_now_add=False, auto_now=True)
type = models.CharField(max_length=4, choices=TYPE_CHOICES, default=FILM)
slug = models.SlugField(blank=True, unique=True, help_text="Automatically generated")
name = models.CharField(max_length=256, blank=True)
redirect = models.ForeignKey('Entity', related_name='entity_redirect', blank=True, null=True, help_text="If this is an alias (see), set Redirect to the primary entry.")
cross_references = models.ManyToManyField('Entity', related_name='entity_cross_reference', blank=True, help_text="This is a 'see also' — 'see' should be performed with a redirect.")
[... and more fields, some of them type-specific]
私はこれはかなり厄介であると認識し、私は「タイプ」を削除し、共通フィールドのすべてを抽象化EntityBase
クラスを作り、そして新しいFilm
、Person
、Company
、およびTerm
モデルを作成したいのですが抽象基本クラスEntityBase
から継承します。
私が新しいモデルを作成したら、すべてのフィールドデータを新しいモデルに移動するためのデータ移行の書き方を理解していると思います。Entity
からオブジェクトを反復し、type
でフィルタリングし、新しいモデル)... を除く ForeignKeyとManyToMany関係。たぶん私は間違った方法を考えているかもしれませんが、移行中に関係が指し示す新しいオブジェクトがまだ存在しない場合、これらの関係をどのように転送できますか?
私はこれが複数ステップの移行を意味すると思われますが、私はこれを行う正しい方法を考えていません。
これについてもっと考えてみたら、私は[この人と同じ問題がある]ことを実感しました。(http://stackoverflow.com/questions/16310930/django-polymorphic-models-or-one-big-model)私は、モデルの概念の明確さを増すために、私が上に示唆したことをすれば、私に関係の問題を引き起こし、物事の終わりを見るだろうと思っています。いずれにしても、4つ以上のモデルにすべての関連する結果を照会する必要があるか、または 'django-gm2m'のようなものを試してみる必要があります。 – bobtiki
(抽象的ではなく)具体的な継承に切り替えると、それらの問題を解決するように見えますが、[具体的な継承を使用することについての恐ろしい警告](http://stackoverflow.com/questions/16310930/django-polymorphic-models-私はちょうどそれをそのまま残して、タイプごとに不要なフィールドを隠すために私の管理コードを少しきれいにするべきでしょうか? – bobtiki