10
votes

Comment faire des uniques dans les modèles Django? Et également indexer une colonne à Django

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)
  • Comment puis-je faire du contenu + IP unique ... alors que ce contenu multiple est correct, mais Le contenu multiple et la propriété intellectuelle n'est pas correct (Vous ne voulez pas que l'utilisateur tarifa deux fois). LI>
  • Comment créer un index de base de données pour le contenu et la propriété intellectuelle ... Parce que je choisirai toujours ceux (pour comparer s'il est déjà dans la base de données). LI> ul> p>


1 commentaires

Pourquoi utiliser charfield () pour IP au lieu de iPaddressfield () ?


5 Réponses :


14
votes

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'),)


1 commentaires

Il peut ê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 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 ( github.com/dcramer/ Django-évaluations ), qui traite très bien des votes anonymes et authentifiés.



5
votes

À propos des index: vous n'avez rien à faire pour Contenu , car il s'agit d'une clé primaire, elle sera indexée. Pour IP , il suffit d'ajouter db_index = true au charfield Constructeur appel: xxx

Plus d'informations sur db_index et d'autres options de terrain ici


2 commentaires

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.



7
votes

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 - 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! -)

Si votre utilisation du nom IP 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! -)


1 commentaires

Une autre idée est d'utiliser un cookie ou un localStorage.



0
votes

Veuillez essayer ce mot-clé de métha: "unique_together" xxx


0 commentaires

1
votes

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. xxx

et, par conséquent, vous pouvez définir plusieurs Contraintes et index .


0 commentaires