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

hvordan man håndhæver en betinget entydighedsbegrænsning

Definer din unikke begrænsning på tværs af et felt mere:deleted og dine pseudo-unikke felter. Tildel derefter modellens id til deleted for at repræsentere en blød sletning; for fortrydede elementer, tildel 0.

Med denne tilgang, for gendannet elementer, da deleted feltet er konsekvent værdsat, vil den unikke begrænsning med flere felter effektivt ignorere værdien af ​​den deleted og håndhæve unikhed for netop de pseudo-unikke felter; for slettede elementer, deleted vil blive taget i betragtning, og da det er unikt, vil begrænsningen altid være opfyldt - så et hvilket som helst antal modeller med de samme pseudo-unikke felters værdier kan eksistere side om side.

For eksempel kan følgende kode være det, du leder efter.

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


  1. Sådan skjuler du en fejlmeddelelse

  2. bestille efter .... tal? Hjælp mig med at sortere ip-adresser

  3. Sådan får du datoen fra en Datetime-kolonne i MySQL

  4. Forskel i den nødvendige tid til at indsætte InnoDB/MyISAM-poster