28

モデルのフィールドは、foo = models.ForeignKey(Foo)検索を高速化するために、列のデータベースインデックスを自動的に追加します。それは良いことですが、Djangoのドキュメントには、model-metaのフィールドがunique_together同じ扱いを受けるかどうかは記載されていません。にリストされている1つのcharフィールドにunique_together、クイックルックアップのためのインデックスが必要なモデルがあります。フィールド定義に重複を追加しても問題はないことはわかっていますがdb_index=True、興味があります。

4

5 に答える 5

34

index_togetherインデックスのパフォーマンス上の利点を得るために追加が必要かどうか疑問に思っている人unique_togetherにとって、Postgresの答えはノーです。機能的には同じです。

于 2017-03-08T16:23:44.303 に答える
13

インデックスを追加する場合unique_togetherは、複数列のインデックスになります。

列の1つに個別にインデックスを付ける場合db_index=Trueは、フィールド定義で指定する必要があると思います。

于 2011-10-20T11:01:31.700 に答える
8

unique_togetherリストに含まれる各フィールドのインデックスは自動的に追加されません。

Djangoの新しいバージョンでは、代わりにインデックスと制約のメタオプションを使用することをお勧めします。

https://docs.djangoproject.com/en/3.2/ref/models/options/#unique-together

https://docs.djangoproject.com/en/3.2/ref/models/options/#index-together

https://docs.djangoproject.com/en/dev/ref/models/indexes/

そして、オープンソースプロジェクトからのサンプルモデル:

class GroupResult(models.Model):"""タスクグループの結果/ステータス。"""

group_id = models.CharField(
    max_length=getattr(
        settings,
        "DJANGO_CELERY_RESULTS_TASK_ID_MAX_LENGTH",
        255
    ),
    unique=True,
    verbose_name=_("Group ID"),
    help_text=_("Celery ID for the Group that was run"),
)
date_created = models.DateTimeField(
    auto_now_add=True,
    verbose_name=_("Created DateTime"),
    help_text=_("Datetime field when the group result was created in UTC"),
)
date_done = models.DateTimeField(
    auto_now=True,
    verbose_name=_("Completed DateTime"),
    help_text=_("Datetime field when the group was completed in UTC"),
)
content_type = models.CharField(
    max_length=128,
    verbose_name=_("Result Content Type"),
    help_text=_("Content type of the result data"),
)
content_encoding = models.CharField(
    max_length=64,
    verbose_name=_("Result Encoding"),
    help_text=_("The encoding used to save the task result data"),
)
result = models.TextField(
    null=True, default=None, editable=False,
    verbose_name=_('Result Data'),
    help_text=_('The data returned by the task.  '
                'Use content_encoding and content_type fields to read.'))

def as_dict(self):
    return {
        'group_id': self.group_id,
        'result': self.result,
        'date_done': self.date_done,
    }

def __str__(self):
    return f'<Group: {self.group_id}>'

objects = managers.GroupResultManager()

class Meta:
    """Table information."""

    ordering = ['-date_done']

    verbose_name = _('group result')
    verbose_name_plural = _('group results')

    indexes = [
        models.Index(fields=['date_created']),
        models.Index(fields=['date_done']),
    ]
于 2019-05-22T06:42:10.100 に答える
7

Django 1.5以降では、 {Model}.Meta.index_togetherclass属性を使用できます。fooとという名前の2つのフィールドがある場合はbar、次を追加します。

class Meta(object):
    index_together = unique_together = [
        ['foo', 'bar']
    ]

一意のフィールドのセットが1つしかない場合は、の1次元反復可能を使用できますunique_together。ただし、ドキュメントには、同じことがに適用されることが示されていませんindex_together

これも大丈夫です:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = [
        ['foo', 'bar']
    ]

ただし、これはドキュメントではサポートされていません。

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = 'foo', 'bar'
于 2014-05-08T17:42:52.120 に答える
1

ドキュメントによると、データベースレベルでのみ一意性を強制します。一般的に、フィールドを一意にすることは、それがインデックスを持っていることを意味しないと思います。ただし、インデックスが存在するかどうかをdbレベルで確認することもできます。そうではありませんが、すべてが示しています。

于 2011-10-20T01:45:16.107 に答える