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.

War es hilfreich?

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'

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top