私の望みは、共通のロケーション モデルを作成し、ロケーションを必要とするさまざまな上位レベルのモデルがそれを参照できるようにすることです。
管理者に複数の部分からなるフォーム (インライン) を表示して、発行元と建物の上位レベルの情報と、それぞれの位置情報を入力できるようにしたいと考えています。インライン システムは、このように動作することを望まないようです。
明らかに、これは非常に標準的な種類の問題のように思えるので、私は何か非常に間違ったことをしています。私のスキーマ設計は失敗していますか?
私は愚かにインラインシステムを使用していますか? 上位レベルのオブジェクトごとに Location のサブクラスを作成したくありません。これは、上位レベルのオブジェクト (メーリング リストや地理的なルックアップなど) に関係なく、さまざまな方法で場所を操作したいからです。
models.py:
...
class Location(models.Model):
"""
A geographical address
"""
# Standard Location stuff
address_line1 = models.CharField("Address line 1", max_length = 45, null=True, blank=True)
...
class Publisher(models.Model):
"""
Contains Publisher information for publishers of yearbooks. Replaces Institution from 1.x
"""
name = models.CharField(max_length=100, null=False, help_text="Name of publisher, e.g. University of Kansas")
groups = models.ManyToManyField(Group, help_text="Select groups that this publisher owns. Usually just one, but multiple groups are possible.")
is_active = models.BooleanField(help_text="Check this box to enable this publisher.")
location = models.OneToOneField(Location)
...
class Building(models.Model):
"""
Contains Building Information
"""
name = models.CharField(max_length=100, null=False, help_text="Name of building, e.g. Physical Sciences")
is_active = models.BooleanField(help_text="Check this box to enable this building.")
location = models.OneToOneField(Location)
...
admin.py:
...
class LocationInline(generic.GenericStackedInline):
model = Location
max_num = 1
extra = 1
class PublisherAdmin(admin.ModelAdmin):
model = Publisher
inlines = [ LocationInline,
]
class BuildingAdmin(admin.ModelAdmin):
model = Building
inlines = [ LocationInline,
]
admin.site.register(Publisher, PublisherAdmin)
admin.site.register(Building, BuildingAdmin)
これを Location モデルに追加することで、インラインの読み込みと表示を強制できます。
# Support reverse lookup for admin
object_id = models.PositiveIntegerField()
content_type = models.ForeignKey(ContentType)
of = generic.GenericForeignKey('content_type', 'object_id' )
しかし、これを行うと、インライン オブジェクトを取得して編集することはできますが、Location がそれを作成したオブジェクトの ID を格納しているため、関係が逆になっているように見えます。
すべてがうまく機能するようにするための推奨されるスキーマ変更 (Django は非常に優れているため) や、後ろ向きに見えるものを意味のあるものにするためのトリックなど、どんな助けも大歓迎です。