Django: unique_together implica db_index= True nello stesso modo in cui lo fa ForeignKey?
-
27-10-2019 - |
Domanda
Un campo su un modello, foo = models.ForeignKey(Foo)
, aggiungerà automaticamente un indice di database per la colonna, al fine di rendere più veloci le ricerche.Va bene, ma i documenti di Django non indicano se i campi nel unique_together
di un meta modello ricevono lo stesso trattamento.Mi capita di avere un modello in cui un campo char elencato in unique_together
richiede un indice per ricerche rapide.So che non farà male a nulla aggiungere un db_index=True
duplicato nella definizione del campo, ma sono curioso.
Soluzione
unique_together
non aggiunge automaticamente gli indici per ogni campo incluso nell'elenco.
Le nuove versioni di Django suggeriscono invece di utilizzare le meta opzioni Index & constraint:
https://docs.djangoproject.com/it / 2.2 / ref / models / options / # unique-together
https://docs.djangoproject.com/it / 2.2 / ref / models / options / # index-together
Altri suggerimenti
Per chiunque venga qui chiedendosi se ha bisogno di un index_together
oltre a unique_together
per ottenere il vantaggio in termini di prestazioni dell'indice, la risposta per Postgres è no , sono funzionalmente lo stesso.
Se unique_together
aggiunge un indice, sarà un indice a più colonne.
Se desideri che una delle colonne venga indicizzata individualmente, credo che tu debba specificare db_index=True
nella definizione del campo.
In Django 1.5 e versioni successive , puoi utilizzare l'attributo di classe {Model}.Meta.index_together
.Se avessi due campi denominati foo
e bar
, dovresti aggiungere:
class Meta(object):
index_together = unique_together = [
['foo', 'bar']
]
Se disponi di un solo insieme di campi univoci, puoi utilizzare un iterabile unidimensionale per unique_together
.Tuttavia, la documentazione non indica che lo stessosi applica a index_together
.
Anche questo andrebbe bene:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = [
['foo', 'bar']
]
Questo, tuttavia, NON è supportato dalla documentazione:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = 'foo', 'bar'