Mysql
 sql >> Database >  >> RDS >> Mysql

come applicare un vincolo di unicità condizionale

Definisci il tuo vincolo univoco in un altro campo:deleted e i tuoi campi pseudounici. Quindi, per rappresentare un'eliminazione temporanea, assegna l'id del modello a deleted; per gli elementi non eliminati, assegnare 0.

Con questo approccio, per gli elementi non eliminati, poiché il deleted campo è valutato in modo coerente, il vincolo univoco multicampo ignorerà effettivamente il valore del deleted e imporre l'unicità solo per i campi pseudo-unici; per gli elementi eliminati, deleted verrà preso in considerazione e, poiché è unico, il vincolo sarà sempre soddisfatto, quindi può coesistere un numero qualsiasi di modelli con gli stessi valori dei campi pseudounici.

Ad esempio, il codice seguente potrebbe essere quello che stai cercando.

class Deletable(models.Model):
    deleted = models.IntegerField(default=0)

    class Meta:
       abstract=True

    def soft_delete(self):
       self.deleted=self.id
       self.save()

class ConcreteModel(Deletable):
    a = models.IntegerField()
    b = models.IntegerField()

    class Meta:
       unique_together=('a', 'b', 'deleted')