2009-11-25 17 views
9

Este es mi modelo simple de base de datos Django. Es para un sistema de clasificación de 5 estrellas.¿Cómo hacer únicos en los modelos de Django? Y también indexar una columna en 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) 

Como puede ver, está vinculado a "Contenido", que es la tabla para mis documentos. Mi pregunta es:

  • ¿Cómo hago contenido + IP única ... así que contenido múltiple está bien, pero contenido múltiple y IP no está bien (no quieren el usuario para evaluar dos veces)
  • Cómo creo un índice de base de datos para contenido e ip ... porque siempre los seleccionaré (para comparar si ya está en la base de datos).
+0

¿Por qué usar 'CharField()' para IP en lugar de 'IPAddressField()'? – Surya

Respuesta

13

En cuanto a su primera pregunta: Usted debe mirar unique_together, ya que esto podría resolver su problema.

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

podría ser mejor convertir la IP en un 'int' antes de almacenarla, y usar un' IntegerField'. utilizará menos espacio (no estoy seguro de por qué ha asignado 200 bytes a una dirección IP) y permitirá más flexibilidad de consulta. es posible que también desee comprobar 'django-ratings' (http://github.com/dcramer/django-ratings), que maneja muy bien los votos anónimos y autenticados. – Carson

5

Acerca de los índices: usted no necesita hacer nada para content, ya que es una clave principal, que será indexado. Para ip, sólo tiene que añadir a la llamada db_index=TrueCharField constructor:

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

Más información sobre opciones db_index y otra de campo here

+1

La indexación de un segundo campo no hará que ese campo sea único con la clave principal. – hughdbrown

+3

No respondía la pregunta sobre uniques. La segunda viñeta en la pregunta pregunta sobre la indexación ip. –

7

Por cierto, si, como se desprende de su terminología, que está utilizando direcciones IP de pie por las identidades de los usuarios, por favor, no - es una idea realmente horrible. Los usuarios que ingresan a través de su ISP cambiarán sus direcciones IP en momentos aleatorios, por lo que pueden votar dos veces; los usuarios de una computadora portátil que se conecta en varias cafeterías, bibliotecas, & c, tendrán direcciones IP variables; los usuarios que comparten una conexión (por ejemplo, compañeros de apartamento) o incluso cada uno de los usuarios que ingresan desde un campus universitario, pueden obtener la misma dirección IP a través de NAT, por lo que solo uno podrá votar ... es difícil pensar ¡De ninguna manera peor para representar las identidades de los individuos! -)

Si su uso del nombre ip para su campo de "identidad de usuario" es accidental y no tiene nada que ver con el uso de direcciones IP, me disculpo, pero en ese caso ! por favor, cambiar el nombre de ese campo -)

+0

Una idea alternativa es utilizar una cookie o LocalStorage. – Josh

0

Por favor, intente esta palabra clave 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'),) 
Cuestiones relacionadas