4

Lorsque je regarde le sqlall pour un models.py qui contient des instructions uniques_together, je ne remarque rien qui ressemble à l'application.Django unique_together sur postgres: appliqué par ORM ou DB?

Dans mon esprit, je peux imaginer que cette connaissance pourrait aider à la base de données d'optimiser une requête, comme suit:

«J'ai déjà trouvé une ligne de spam 42 et les œufs 91, donc dans ma recherche d'œufs 91 , Je n'ai plus besoin de vérifier les lignes avec du spam 42. "

Ai-je raison de dire que cette connaissance peut être utile à la DB?

Ai-je raison de dire qu'il n'est pas imposé de cette façon (c'est-à-dire qu'il est seulement appliqué par l'ORM)?

Si oui aux deux, est-ce un défaut?

+3

Les docs disent que c'est imposé au niveau db, cela serait-il suffisant? :) – shanyu

+0

Hmm, pouvez-vous lier? J'ai regardé, mais je n'ai pas vu ça. Même si c'est le cas, je ne vois pas où la mise en application a lieu dans la sortie sqlall. – jMyles

+0

La voici: https://docs.djangoproject.com/fr/dev/ref/models/options/#django.db.models.Options.unique_together – shanyu

Répondre

4

Voici un exemple de ce à quoi cela devrait ressembler. Supposons que vous avez le modèle:

class UserConnectionRequest(models.Model): 
    sender = models.ForeignKey(UserProfile, related_name='sent_requests') 
    recipient = models.ForeignKey(UserProfile, related_name='received_requests') 
    connection_type = models.PositiveIntegerField(verbose_name=_(u'Connection type'), \ 
                choices=UserConnectionType.choices()) 

    class Meta: 
     unique_together = (("sender", "recipient", "connection_type"),) 

Exécution sqlall retourne:

CREATE TABLE "users_userconnectionrequest" (
    "id" serial NOT NULL PRIMARY KEY, 
    "sender_id" integer NOT NULL REFERENCES "users_userprofile" ("id") DEFERRABLE INITIALLY DEFERRED, 
    "recipient_id" integer NOT NULL REFERENCES "users_userprofile" ("id") DEFERRABLE INITIALLY DEFERRED, 
    "connection_type" integer, 
    UNIQUE ("sender_id", "recipient_id", "connection_type") 
) 

Lorsque ce modèle est correctement synchronisé sur DB, il a contrainte unique (postgres):

CONTRAINTE users_userconnectionrequest_sender_id_2eec26867fa22bfa_uniq UNIQUE (sender_id, recipient_id, connection_type),

Questions connexes