2016-10-12 7 views
1

django dbに異なるプロパティを持つオブジェクトのリストを格納するには?

[ 
    { 
     'name': 'Object1', 
     'color': 'red', 
     'shape': 'ellipse' 
    }, 
    { 
     'name': 'Object2', 
     'color': 'green', 
     'shape': 'circle' 
    } 
] 

のようにMySQLのデータに格納することは容易である。しかし、オブジェクト属性の数が異なる場合にはどのような(属性は平坦であり、それらがネストされていませんか)?

[ 
    { 
     'name': 'Object1', 
     'color': 'red', 
     'shape': 'ellipse', 
     'eccentricity': 0.5 
    }, 
    { 
     'name': 'Object2', 
     'color': 'green', 
     'shape': 'circle' 
     'radius': 5 
    } 
] 

サブクラスは解決策ではありません。

どのように私はそれをmysqlで処理するのですか?または、これが可能でない場合、おそらくpostgresql?

非リレーショナルデータベースについては、どのようなものを使用するのが最適ですか?

これらの属性に基づいてクエリを作成する必要があります。

ありがとうございます。

答えて

3

この種のタスクに使用できるポストグラムにはJsonFieldがあります。また、django-extensionsのようなmysqlで動作するJsonFieldを追加するdjango用のアプリもたくさんあります。

1

サブクラス化を避ける理由はわかりません。これを行う最善の方法はサブクラス化です。この例では、おそらくshape属性をメジャークラスとして使用すると思われます。たとえば、thusly Shapeクラスを作成することができます。これはcoloreccentricity列を使用して、モデル内の2つのテーブルcolorradius列を持つCircleテーブルだけでなく、Ellipseテーブルを作成します

class Shape(models.Model): 
    color = models.CharField(max_length=20) 
    class Meta: 
     abstract = True 

class Circle(Shape): 
    radius = FloatField() 

class Ellipse(Shape): 
    eccentricity = FloatField() 

何らかの理由でサブクラス化を避け、PostgreSQLを使用している場合は、異なる値のJSONField(おそらく属性などと呼ばれる)を宣言できます。しかし、プログラムにアクセスするのは難しくなります。これは次のようになります:

class Shape(models.Model): 
    color = models.CharField(max_length=20) 
    attributes = models.JSONField() 
関連する問題