2016-12-01 7 views
0

私は様々な画像タイプをカプセル化するモデルを持っているDjangoベースのアプリケーションを書いています。次のように私は備品としてそれらをロードする次のようdjangoのモデルとオブジェクトのメタデータを追加

[ 
    { 
    "model": "app.ImageTypeModel", 
    "pk": 1, 
    "fields": { 
     "type": "PNG", 
     "dims": 1 
    } 
    }, 

    { 
    "model": "app.ImageTypeModel", 
    "pk": 2, 
    "fields": { 
     "type": "Custom", 
     "dims": 100 
    } 
    }, 

    { 
    "model": "app.ImageTypeModel", 
    "pk": 3, 
    "fields": { 
     "type": "JPEG", 
     "dims": 1 
    } 
    }, 

    { 
    "model": "app.ImageTypeModel", 
    "pk": 4, 
    "fields": { 
     "type": "BMP", 
     "dims": 1 
    } 
    } 
] 

は、対応するモデルの宣言は以下の通り

class ImageTypeModel(models.Model): 
    type = models.CharField(max_length=100) 
    dims = models.IntegerField() 

    class Meta: 
     db_table = "image_type" 

はまた、私は(私は簡略化のためにいくつかのフィールドを削除した)画像の様々なインスタンスを有します。

class ImageModel(models.Model): 
    type = models.ForeignKey(ImageTypeModel) 

    class Meta: 
     db_table = "images" 

これらの画像タイプのそれぞれについて、私は異なる特性を指定したいと思います。たとえば、タイプがCustomの画像の場合、整数、文字列、浮動小数点数、浮動小数点数のベクトルなど、特定のデータ型になるさまざまなプロパティを持つことができます。これを定義する1つの方法は、これらのデータ型用の表と、各イメージ型用の追加表(これらの表構成表と呼ぶ)です。各行はプロパティ名と関連データ型になります。私はそれに基づいて自動フォームを作成してみることができます。

ただし、画像タイプと関連する設定テーブルの関連付け方法がわかりません。だから、元のフィクスチャの例では、別のフィールドとしてデータベーステーブル名を追加することをお勧めしますか?あるいは、これらの設定テーブルごとにモデルを作成する必要がありますが、これらのモデルをフィクスチャーコードで参照する方法がわかりません。

このような問題にアプローチする方法についてアドバイスを探すには、バックエンドのオブジェクトに対してもmetadataのこの王を指定する必要があり、djangoモデルやフィクスチャにどのように適合することができるかを調べてください。

答えて

2

抽象基本クラス内で共通の動作を定義することができます。子クラスでは、異なる仕様のみを入れます.Djangoはabstract base classes for modelsをサポートします。

class Image(models.Model): 
    """ A graphic image. """ 

    name = models.CharacterField(max_length=1024) 
    suffix = NotImplemented 

    class Meta: 
     abstract = True 


class SVGImage(Image): 
    """ A graphic image in Scalable Vector Graphics (SVG) format. """ 

    suffix = ".svg" 
    version = models.CharacterField(max_length=20) 


class JPEGImage(Image): 
    """ A graphic image in Joint Picture Experts Group (JPEG) format. """ 

    suffix = ".jpeg" 
    resolution = models.IntegerField() 

Imageモデルは、データベース内で表現されませんが、そのすべての定義された機能は、子クラスに利用できるようになります。したがって、SVGImageのインスタンスはname,suffix、およびversionの属性を持ちます。 JPEGImageのインスタンスは、name,suffix、およびresolutionの属性を持ちます。余談として


:あなたはクラス名に余分…Modelサフィックスを追加するべきではありませんので、あなたのDjangoのモデルは、modelsという名前のモジュールになります。

代わりに、fooapp.models.JPEGImageは十分に十分です。指定する必要がなくてもデータベーステーブルの名前が正しく指定されていることを意味します。

+0

答えをありがとう!私はちょうど同じ方法でこれらの追加の属性を含めるだけでなく、私の備品を拡張することができると思います。命名規則にも頭を付けてくれてありがとう。 – Luca

関連する問題