2010-11-26 4 views
0

Gurus:Améliorer l'exécution du temps de requête simple

J'ai un modèle de données très simple concernant deux types différents de User s via un Interaction:

# myapp/models.py 
class C1(models.Model): 
user = models.ForeignKey(User) 

class C2(models.Model): 
user = models.ForeignKey(User) 

class Interaction(models.Model): 
c1 = models.ForeignKey(C1) 
c2 = models.ForeignKey(C2) 
date = models.DateField() 

Ainsi, un Interaction a une User de classe C1 , un User de classe C2, et une date (en plus de la clé primaire, automatiquement un entier); une paire donnée d'utilisateurs peut avoir beaucoup de Interaction s.

J'ai peuplé la base de données avec 2000 random User s (1000 chaque classe), et quand j'interroge le Interaction le temps d'exécution est trop lent (environ trois secondes - inacceptable dans l'environnement de production).

Y at-il quelque chose que je peux faire pour améliorer le temps d'exécution de cette recherche? Dois-je définir le Interaction différemment?

Merci.

+0

Quelle est la requête exacte que vous exécutez? –

Répondre

4

Si vous souhaitez stocker des informations supplémentaires concernant vos utilisateurs, Django fournit une méthode pour spécifier un modèle associé au site - appelé «profil d'utilisateur» - à cette fin. Pour utiliser cette fonctionnalité, définissez un modèle avec des champs pour les informations supplémentaires que vous souhaitez stocker, ou des méthodes supplémentaires que vous aimeriez avoir, et ajoutez également un OneToOneField de votre modèle au modèle User. . Cela garantira qu'une seule instance de votre modèle peut être créée pour chaque utilisateur. Par exemple:

# settings.py 
AUTH_PROFILE_MODULE = 'myapp.UserProfile' 

# myapp/models.py 
class UserProfile(models.Model): 
    CLASS_CHOICES = (
     (0, 'Yellow User'), 
     (1, 'Green User'), 
    ) 
    user_class = models.IntegerField(choices=CLASS_CHOICES) 
    user = models.OneToOneField(User) 

class Interaction(models.Model): 
    u1 = models.ForeignKey(User, related_name='u1s') 
    u2 = models.ForeignKey(User, related_name='u2s') 
    date = models.DateField() 

La création d'un nouveau modèle et d'une table associée pour chaque classe User ne semble pas être une bonne conception.

+0

Ouais, j'ai pensé créer deux classes entièrement différentes basées sur l'utilisateur pourrait ne pas être la meilleure idée ... Je vais essayer votre approche. Merci! – Escualo

0

Vous avez utilisé les clés étrangères pour associer C1, C2 avec Users, et a appelé ce un one-to-many. Cependant, la relation entre InteractionC1, C2 n'est pas un-un-aux beaucoup parce qu'un Interaction peut être associé à Users, et un User peut aussi avoir plusieurs Interactions. Ceci est appelé relation plusieurs-à-plusieurs, et est représenté dans les modèles Django en utilisant models.ManyToManyField.

Donc, essayez de changer votre fichier models.py à -

class Interaction(models.Model): 
    ic1 = models.ManyToManyField(C1) 
    ic2 = models.ManyToManyField(C2) 
    date= models.DateField() 

Voir si cela aide ...

+0

Je ne vois pas comment c'est correct. Sûrement la relation entre C1 et C2 est le many-to-many, et l'interaction est la table à travers pour cette relation? –

+0

mais n'est-ce pas une meilleure façon de représenter cette relation db? D'accord, que je ne suis pas sûr de la performance ... –

Questions connexes