Django: Does unique_together implica db_index = True da mesma forma que ForeignKey faz?
-
27-10-2019 - |
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.
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.