2017-06-06 11 views
0

ためArrayFieldかのManyToManyFieldを使用すべき:は、私はジャンゴでPostgresのDBのモデルにタグを追加しようとしていますし、私は2つの解決策を見つけたタグ

from django.contrib.postgres.fields import ArrayField 

class Post(models.Model): 
    tags = ArrayField(models.CharField(max_length=140)) 
    ... 

私のコードで他のデータベースバックエンドをサポートすることを気にしないと仮定した場合、推奨される解決策は何ですか?

+0

ホイールを再開発したくない場合 - https://django-taggit.readthedocs.io/en/latest/ – rayy

+0

@rayy私の質問は、私が気づいている外部モジュールの使用に関するものではありません。実装の選択の詳細については、別のフィールドタイプの長所や短所についてもっと知りたかった – aliva

+0

ArrayField内の[Django JSONField]の複製が可能です(https://stackoverflow.com/questions/41134260/django-jsonfield-inside- arrayfield) – e4c5

答えて

1

[配列]フィールドを使用する場合は、 、

  • あなたのDB内の各行のサイズが少し大きくなるように起こっているので、Postgresは多くのTOASTテーブルを使用しようとしている(http://www.postgresql.org/docs/9.5/static/storage-toast.html

  • あなたが行を取得するたびに、あなたがdefer(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#defer)フィールドを明示的に使用していないか、それ以外の場合は、その行全体を反復するたびにこれらの値をすべてロードするコストを支払うだけでクエリから除外されます。それがあなたが必要とするものなら、そうすることができます。

  • この配列の値に基づいたフィルタリングは可能ですが、Django ORMはM2Mテーブルと同じようにはっきりとしません。

あなたはM2M分野、

  • を使用している場合は、それらの関連する値に、より簡単にフィルタリングすることができ これらのフィールドは、デフォルトで延期されている、あなたがそれらを必要とする場合prefetch_relatedしてからであれば空想GETを使用することができますロードされた値のサブセットのみを必要とします。

  • 鍵と追加のIDフィールドのために、DB内の合計ストレージがM2Mの方がわずかに高くなります。

  • この場合のジョインのコストは、キーによって完全に無視できます。

上記の答えは私のものではありません。しばらく前に、私はジャンゴを学んだときにこのジレンマに遭遇しました。私はこの質問で答えが見つかった、Django Postgres ArrayField vs One-to-Many relationship

あなたが探していたものを得ることを願っています。

1

クラスタグを監視する場合(たとえば、タグの数、特定のタグの数など)、最初のオプションは、モデルにフィールドを追加したり、アプリ。

一方、表示または最小限の処理のためだけに配列リストにしたい場合は、そのオプションを使用してください。

しかし、あなたは時間を節約し、アプリに豊かさを追加したい場合は、あなたがこの

https://github.com/alex/django-taggit

を使用することができますこれは、初期化するために、このように簡単です:

from django.db import models 

from taggit.managers import TaggableManager 

class Food(models.Model): 
# ... fields here 

    tags = TaggableManager() 

とすることができ

>>> apple = Food.objects.create(name="apple") 
>>> apple.tags.add("red", "green", "delicious") 
>>> apple.tags.all() 
[<Tag: red>, <Tag: green>, <Tag: delicious>] 
+0

ありがとう、しかし、私の質問は、私の選択肢の違いは何かについてです(なぜaはbより良いです)taggitは良い選択ですが、私の質問はタグ付けモジュールについては正確ではない、あなたの答えの最初の部分は私が探していたもの。 – aliva

+0

ありがとうございます。私はあなたの質問に答えることができましたか、他に質問がありますか? – crazyglasses

+0

詳細を待っています:-) – aliva

関連する問題