Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

como aplicar uma restrição de exclusividade condicional


Defina sua restrição exclusiva em mais um campo:deleted e seus campos pseudo-exclusivos. Em seguida, para representar uma exclusão reversível, atribua o id do modelo a deleted; para itens não excluídos, atribua 0.

Com esta abordagem, para itens não excluídos, uma vez que o deleted for valorizado de forma consistente, a restrição exclusiva de vários campos ignorará efetivamente o valor do deleted e impor exclusividade apenas para os campos pseudo-exclusivos; para itens excluídos, deleted será levado em consideração e, como é único, a restrição sempre será satisfeita - portanto, qualquer número de modelos com os mesmos valores de campos pseudo-únicos podem coexistir.

Por exemplo, o código a seguir pode ser o que você está procurando.
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')