2

これが私がやろうとしていることであり、失敗しています...

他のオブジェクトとの一般的な関係を持つファイル モデルがあります。

class File(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    file = models.FileField(upload_to='files/%Y/%m/%d')
    # etc....

また、ダウンロードではなくページ内に表示される画像の特定のケースに対処するために、ファイルのサブクラスが必要です。

class Image(File):
    file = models.ImageField(upload_to='files/%Y/%m/%d')

File モデルのジェネリック インラインを含め、上記のすべてが正常に機能しますが、Image モデルのジェネリック インラインを使用するまでは --- 保存プロセスが基本クラス インスタンスの作成に失敗し、Image が.file_ptr (基本クラスへの「秘密の」外部キー) を None にすることはできません。

したがって、基本的に、一般的なインラインは現時点で複数テーブルの継承を適切にサポートしていません。

これを必要以上に複雑にしている可能性が非常に高いので、誰かがこの問題の修正、または同じ目的を達成するためのより良い方法を提案できますか?

さらに説明が必要な場合はお知らせください。

4

1 に答える 1

0

継承は、リレーショナルモデルで2つの方法で実装できます。

サブクラスは、スーパークラスが繰り返されるのと同じ列を持つ新しいテーブルにすることができます。これは、スーパークラスをオーバーライドする抽象スーパークラスまたはサブクラス機能がある場合にうまく機能します。

サブクラスは、スーパークラステーブルに結合された一意の列にすることができます。これは、具体的なスーパークラスがある場合にうまく機能します。

あなたの場合、次のように見えます。

class FileFacts( models.Model ):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

class DownloadFile( models.Model ):
    facts = models.ForeignKey( FileFacts )
    file = models.FileField(upload_to='files/%Y/%m/%d')

class InlineImage( models.Model ):
    facts = models.ForeignKey( FileFacts )
    file = models.ImageField(upload_to='files/%Y/%m/%d')

これは、サブクラスのようなモデルを処理するための私の好みです。

于 2008-11-22T13:30:28.187 に答える