2009-11-25 4 views
9

Dies ist mein einfaches Django-Datenbankmodell. Es ist für ein 5-Sterne-Bewertungssystem.Wie mache ich Unikate in Django Models? Und indexieren Sie auch eine Spalte in 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) 

Wie Sie sehen können, ist es mit "Inhalt" verknüpft, was die Tabelle für meine Dokumente ist. Meine Frage ist:

  • Wie kann ich Inhalt + ip einzigartig ... so , dass es mehrere Content ist in Ordnung, aber mehrere Inhalt und IP ist nicht in Ordnung (es der Benutzer nicht will zweimal, um zu bewerten).
  • Wie erstelle ich einen Datenbankindex für Inhalt und IP ..., weil ich immer diejenigen auswählen werde (um zu vergleichen, ob es bereits in der Datenbank ist).
+0

Warum 'CharField()' für IP anstelle von 'IPAddressField()'? – Surya

Antwort

13

In Bezug auf Ihre erste Frage: Sie bei unique_together aussehen sollte, da dies Ihr Problem lösen könnte.

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

könnte es besser sein, die IP vor dem Speichern in ein 'int' zu konvertieren und ein 'IntegerField' zu verwenden. Es wird weniger Speicherplatz benötigen (ich bin mir nicht sicher, warum Sie einer IP-Adresse 200 Byte zugewiesen haben), und Sie haben mehr Flexibilität bei der Abfrage. können Sie auch "django-ratings" (http://github.com/dcramer/django-ratings) ausprobieren, die sowohl anonyme als auch authentifizierte Abstimmungen sehr gut behandeln. – Carson

5

über den Indizes: Sie brauchen nichts weiter zu tun für content, da es ein Primärschlüssel ist, wird es indiziert werden. Für ip, fügen Sie einfach db_index=True zum CharField Konstruktoraufruf:

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

Mehr Informationen über db_index und andere Feldoptionen here

+1

Das Indizieren eines zweiten Feldes wird dieses Feld nicht mit dem Primärschlüssel eindeutig machen. – hughdbrown

+3

Ich beantwortete nicht die Frage nach Uniques. Der zweite Punkt in der Frage fragt nach Indexierung von IP. –

7

BTW, wenn, wie es aus Ihrer Terminologie erscheint, verwenden Sie die IP-Adressen als Stehen für die Identität der Benutzer, bitte nicht - es ist eine ernsthaft schreckliche Idee. Benutzer, die über ihren Internetdienstanbieter eintreffen, erhalten zu einem beliebigen Zeitpunkt Änderungen an ihren IPs, sodass sie möglicherweise zweimal abstimmen. Benutzer auf einem Laptop verbinden bei verschiedenen Cafés, Bibliotheken, & c, werden immer variierende IPs haben; Benutzer, die sich eine Verbindung teilen (z. B. Mitbewohner) oder sogar jeder einzelne Benutzer, der von einem Universitätsgelände kommt, erhält möglicherweise die gleiche IP-Adresse über NAT, sodass nur einer abstimmen kann ... es ist schwer zu denken von irgendeinem schlechteren Weg, Identitäten von Einzelpersonen zu vertreten! -)

Wenn Sie den Namen ip für Ihr Feld "Benutzeridentität" versehentlich verwenden und nichts mit der Verwendung von IP-Adressen zu tun hat, entschuldige ich mich, aber in diesem Fall ! Sie tun das Feld umbenennen -)

+0

Eine alternative Idee ist die Verwendung eines Cookies oder LocalStorage. – Josh

0

Bitte versuchen Sie dieses metha Stichwort: "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'),) 
Verwandte Themen