sql >> Base de Datos >  >> RDS >> Mysql

cómo hacer cumplir una restricción de unicidad condicional

Defina su restricción única en un campo más:deleted y sus campos pseudo-únicos. Luego, para representar una eliminación temporal, asigne la identificación del modelo a deleted; para elementos no eliminados, asigne 0.

Con este enfoque, para elementos no eliminados, ya que deleted el campo tiene un valor consistente, la restricción única de múltiples campos ignorará efectivamente el valor del deleted y hacer cumplir la unicidad solo para los campos pseudo-únicos; para elementos eliminados, deleted se tendrá en cuenta, y dado que es único, la restricción siempre se cumplirá, por lo que puede coexistir cualquier número de modelos con los mismos valores de campos pseudo-únicos.

Por ejemplo, el siguiente código podría ser lo que está buscando.

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