2009-11-25 5 views
9

Ceci est mon modèle de base de données Django simple. C'est pour un système de notation 5 étoiles.Comment créer des uniques dans les modèles Django? Et aussi indexer une colonne dans Django

class Rating(models.Model): 
    content = models.OneToOneField(Content, primary_key=True) 
    ip = models.CharField(max_length=200, blank=True) 
    rating = models.IntegerField(default=0) 

Comme vous pouvez le voir, il est lié à "Contenu", qui est la table pour mes documents. Ma question est:

  • Comment puis-je faire du contenu + ip unique ... que le contenu multiple est correct, mais plusieurs contenus et IP n'est pas correct (ne veulent pas que l'utilisateur deux fois plus).
  • Comment est-ce que je crée un index de base de données pour le contenu et l'IP ... parce que je les sélectionnerai toujours (pour comparer s'il est déjà dans la base de données).
+0

Pourquoi utiliser 'CharField()' pour IP au lieu de 'IPAddressField()'? – Surya

Répondre

13

En ce qui concerne votre première question: Vous devriez regarder unique_together, car cela pourrait résoudre votre problème.

class Rating(models.Model): 
    content = models.OneToOneField(Content, primary_key=True) 
    ip = models.CharField(max_length=200, blank=True) 
    rating = models.IntegerField(default=0) 

    class Meta: 
     unique_together= (('content', 'ip'),) 
+1

il pourrait être préférable de convertir l'adresse IP en un «int» avant de stocker, et d'utiliser un 'IntegerField'. il utilisera moins d'espace (je ne sais pas pourquoi vous avez alloué 200 octets à une adresse IP), et permettra une plus grande flexibilité des requêtes. vous pouvez également consulter 'django-ratings' (http://github.com/dcramer/django-ratings), qui gère très bien les votes anonymes et authentifiés. – Carson

5

A propos des index: vous n'avez pas besoin de faire quoi que ce soit pour content, car il est une clé primaire, il sera indexé. Pour ip, il suffit d'ajouter db_index=True à l'appel constructeur CharField:

ip = models.CharField(max_length=200, blank=True, db_index=True) 

Plus d'informations sur db_index et d'autres options sur le terrain here

+1

L'indexation d'un second champ ne rendra pas ce champ unique avec la clé primaire. – hughdbrown

+3

Je ne répondais pas à la question sur les uniques. La deuxième puce de la question pose une question sur l'indexation ip. –

7

BTW, si, comme il ressort de votre terminologie, vous utilisez les adresses IP comme debout pour les identités des utilisateurs, s'il vous plaît ne pas - c'est une idée sérieusement horrible. Les utilisateurs qui arrivent par l'entremise de leur fournisseur de services Internet verront leurs adresses IP changer au hasard, de sorte qu'ils pourraient voter deux fois; les utilisateurs d'un ordinateur portable se connectant à divers cafés, bibliothèques, & c, auront des adresses IP toujours variables; les utilisateurs partageant une connexion (par exemple, les colocataires), ou même tous les utilisateurs venant d'un campus universitaire, peuvent obtenir la même adresse IP via NAT, donc un seul pourra voter ... c'est difficile de penser Si votre utilisation du nom ip pour votre champ "identité d'utilisateur" est accidentelle et n'a rien à voir avec l'utilisation des adresses IP, excusez-moi, mais dans ce cas ! S'il vous plaît ne pas renommer ce champ -)

+0

Une autre idée consiste à utiliser un cookie ou LocalStorage. – Josh

0

S'il vous plaît essayer ce mot-clé Metha: "unique_together"

class PowerBoardSwitches(models.Model): 
     id = models.AutoField(primary_key=True, verbose_name='Switch id') 
     powerBoardId = models.ForeignKey(PowerBoardDevice, models.DO_NOTHING, db_column='powerBoardId', verbose_name='Power Board Id') 
     powerBoardSwitchId = models.IntegerField() 
     powerBoardSwitchStatus = models.IntegerField() 
     createdOn = models.DateTimeField(auto_now_add=True, verbose_name='Created on date') 
     updatedOn = models.DateTimeField(auto_now_add=True, verbose_name='Updated on date') 

     class Meta: 
      unique_together = (('powerBoardId', 'powerBoardSwitchId'),) 
Questions connexes