Django: Bedeutet unique_together db_index= True auf die gleiche Weise wie ForeignKey?
-
27-10-2019 - |
Frage
foo = models.ForeignKey(Foo)
, ein Feld in einem Modell, fügt automatisch einen Datenbankindex für die Spalte hinzu, um die Suche zu beschleunigen.Das ist gut und gut, aber in Djangos Dokumenten wird nicht angegeben, ob die Felder im unique_together
eines Modell-Metas die gleiche Behandlung erhalten.Ich habe zufällig ein Modell, in dem ein Zeichenfeld, das im unique_together
aufgeführt ist, einen Index für die schnelle Suche benötigt.Ich weiß, dass es nichts schaden wird, einen doppelten db_index=True
in die Felddefinition einzufügen, aber ich bin neugierig.
Lösung
unique_together
fügt nicht automatisch Indizes für jedes in der Liste enthaltene Feld hinzu.
In den neuen Versionen von Django wird empfohlen, stattdessen Metaoptionen für Index und Einschränkungen zu verwenden:
https://docs.djangoproject.com/de / 2.2 / ref / models / options / # unique-together
https://docs.djangoproject.com/de / 2.2 / ref / models / options / # index-together
Andere Tipps
Wenn Sie hierher kommen und sich fragen, ob Sie zusätzlich zum index_together
einen unique_together
benötigen, um den Leistungsvorteil des Index zu erzielen, lautet die Antwort für Postgres no , sie sind funktional gleich.
Wenn unique_together
einen Index hinzufügt, handelt es sich um einen mehrspaltigen Index.
Wenn Sie möchten, dass eine der Spalten einzeln indiziert wird, müssen Sie meines Erachtens db_index=True
in der Felddefinition angeben.
In Django 1.5 und höher können Sie das Klassenattribut {Model}.Meta.index_together
verwenden.Wenn Sie zwei Felder mit den Namen foo
und bar
hätten, würden Sie Folgendes hinzufügen:
class Meta(object):
index_together = unique_together = [
['foo', 'bar']
]
Wenn Sie nur einen Satz eindeutiger Felder haben, können Sie eine eindimensionale Iteration für unique_together
verwenden. die Dokumentation weist jedoch nicht darauf hingilt für index_together
.
Das wäre auch in Ordnung:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = [
['foo', 'bar']
]
Dies wird jedoch NICHT von der Dokumentation unterstützt:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = 'foo', 'bar'