Ceci est mon modèle de base de données Django simple. C'est pour un système de notation 5 étoiles.
class Rating(models.Model):
content = models.OneToOneField(Content, primary_key=True)
ip = models.CharField(max_length=200, blank=True)
rating = models.IntegerField(default=0)
5 Réponses :
En ce qui concerne votre première question: Vous devriez regarder unique_tOther , car cela pourrait Résolvez 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'),)
Il peut être préférable de convertir l'adresse IP en un int code> avant de stocker et d'utiliser un integerfield code>. Il utilisera moins d'espace (je ne suis pas sûr de savoir pourquoi vous avez alloué 200 octets à une adresse IP) et laissez plus de flexibilité de requête. Vous pouvez également consulter django-notes code> ( github.com/dcramer/ Django-évaluations ), qui traite très bien des votes anonymes et authentifiés.
À propos des index: vous n'avez rien à faire pour Plus d'informations sur db_index et d'autres options de terrain ici P> p> Contenu code>, car il s'agit d'une clé primaire, elle sera indexée. Pour IP code>, il suffit d'ajouter db_index = true code> au charfield code> Constructeur appel:
L'indexation d'un deuxième champ ne fera pas ce champ unique avec la clé primaire.
Je ne répondais pas à la question sur les uniques. La deuxième balle de la question pose des questions sur l'indexation de la propriété intellectuelle.
BTW, si, comme il ressort de votre terminologie, vous utilisez des adresses IP comme étant debout pour les identités des utilisateurs, s'il vous plaît ne faites pas strong> - c'est une idée sérieusement horrible. Les utilisateurs arrivant par le biais de leur fournisseur de services Internet deviendront changés par IPS au hasard, afin qu'ils puissent voter deux fois; Les utilisateurs d'un ordinateur portable se connectent dans divers cafés, bibliothèques et C, auront toujours varié des IPS; Les utilisateurs partageant une connexion (par exemple, des appartements d'appartements), voire chacun des utilisateurs venant d'un campus universitaire, pourraient obtenir la même adresse IP via NAT, alors seulement que l'on puisse voter ... il est difficile de penser de tout moyen pire de représenter les identités des individus! -) p>
Si votre utilisation du nom IP code> pour votre champ "identité d'utilisateur" est accidentelle et n'a rien à voir avec l'utilisation d'adresses IP, je m'excuse, mais dans ce cas, veuillez renommer ce champ! -) p>
Une autre idée est d'utiliser un cookie ou un localStorage.
C'est la réponse pour ceux qui utilisent Django 3.0 +.
Il est préférable d'utiliser UNIQReconsRaint (selon les documents) pour faire des uniques. p> et, par conséquent, vous pouvez définir plusieurs Contraintes et index . p> p>
Pourquoi utiliser
charfield () code> pour IP au lieu deiPaddressfield () code>?