7
votes

Django conditionnel unique ensemble

J'ai un modèle qui ressemble à ce qui suit:

class LibraryEntry(models.Model):
  host_lib_song_id = models.IntegerField()
  song = models.CharField(max_length=200)
  artist = models.CharField(max_length=200)
  album = models.CharField(max_length=200)
  owning_user = models.ForeignKey(User)
  is_deleted = models.BooleanField(default=False)


2 commentaires

Avez-vous essayé docs.djangoproject.com/fr/dev/ Réf / modèles / Options / ... ou cela ne fonctionnerait-il pas car ils ne sont qu'uniques si is_deleted = false ?


Oui, j'ai essayé ça. Mais mon is_deletted = Faux jette une clé de singe dans ce sens.


3 Réponses :


4
votes

Vous ne pouvez pas exprimer cela via la contrainte meta.unique_together code>, mais via Validation du modèle de Django :

class LibraryEntry(models.Model):
    def clean(self):
        from django.core.exceptions import ValidationError
        try:
            # try to find a duplicate entry and exclude 'self'
            duplicate = LibraryEntry.objects.exclude(pk=self.pk)\
                .get(owning_user=self.owning_user, 
                     host_lib_song_id=self.host_lib_song_id,
                     is_deleted=False)
            raise ValidationError('Library Entry already exists!')
        except: LibraryEntry.DoesNotExist:
            # no duplicate found
            pass


1 commentaires

Ceci n'est pas appliqué au niveau de la base de données



11
votes

remplacer validate_unique pour vérifier le caractère unique si is_deletted est false est plus approprié: xxx


4 commentaires

Qu'est-ce qui est avec la page sélectionnée ? Est-ce une faute de frappe? De plus, je pense que je veux si auto.is_dropeted parce que je veux seulement faire respecter cela sur des choses que ne sont pas supprimées supprimées. À droite?


Corriger sur les deux comptes. Copié cela former un projet sur lequel je travaille et je n'ai pas tout attrapé. Réponse mise à jour.


N'a-t-elle pas unique pour générer une contrainte de base de données? Remplacer validate_unique empêchera Django d'exécuter les contrôles d'unicité, mais vous obtiendrez une erreur d'intégrité lorsque vous essayez de sauvegarder sur DB.


@Alasdair: Vous êtes correct. J'ai oublié qu'il a été appliqué au niveau de la base de données. Remplacer validate_unique est toujours la méthode appropriée, mais vous devez faire la validation vous-même au lieu d'utiliser la contrainte. Code mis à jour ci-dessus.



1
votes

Vous pouvez utiliser uniqueconstraint si vous utilisez django 2.2 +. Vous pouvez voir la réponse complète ici .


0 commentaires