Pergunta

Um campo em um modelo, foo = models.ForeignKey(Foo) irá adicionar automaticamente um índice de banco de dados para a coluna, a fim de fazer look-ups mais rápido. Isso é bom e bem, mas docs do Django não indicar se os campos em unique_together de um modelo de meta receber o mesmo tratamento. Acontece que eu tenho um modelo no qual um campo caractere que está listado em unique_together requer um índice para pesquisas rápidas. Eu sei que ele vai nada mal para adicionar um db_index=True duplicado na definição do campo, mas estou curioso.

Foi útil?

Solução

unique_together não adiciona automaticamente índices para cada campo incluído na lista.

As novas versões do Django sugiro usar Index & opções meta de restrição em vez disso:

https://docs.djangoproject.com/ en / 2.2 / ref / modelos / opções / # única reunião

https://docs.djangoproject.com/ en / 2.2 / ref / modelos / opções / # índice de conjunto

Outras dicas

Para qualquer um que vem aqui me perguntando se eles precisam de um index_together além unique_together para obter benefício de desempenho do índice, a resposta para Postgres é nenhum , eles são funcionalmente ao mesmo.

Se unique_together não adicionar um índice, que será um índice de coluna múltipla.

Se você quiser uma das colunas a serem indexados individualmente, acredito que você precisa especificar db_index=True na definição de campo.

Em Django 1.5 e superior , você pode usar o atributo de classe {Model}.Meta.index_together. Se você tivesse dois campos nomeados foo e bar, você adicionaria:

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

Se você tem apenas um conjunto de campos exclusivos, você pode usar um unidimensional iterable para unique_together. No entanto, a documentação não indica que o mesmo aplica-se a index_together.

Isso também seria bom:

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

Este, porém, é não apoiado pela documentação:

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

De acordo com a os docs , ele só irá reforçar a exclusividade no nível de banco de dados. Eu acho que geralmente tornando um campo único não implica que tem um índice. Embora você também pode simplesmente verificar db nível, se existe o índice. Tudo indica que ele não faz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top