Au lieu d'utiliser des modèles personnalisés de nettoyage/d'économie, j'ai créé un champ personnalisé en substituant l' pre_save
méthode django.db.models.BooleanField
. Au lieu de lever une erreur si un autre champ a été True
, j'ai fait tous les autres champs False
si elle a été True
. Aussi, au lieu de lever une erreur si le champ a été False
et qu'aucun autre domaine a été, True
, je l'ai enregistré le champ True
fields.py
from django.db.models import BooleanField
class UniqueBooleanField(BooleanField):
def pre_save(self, model_instance, add):
objects = model_instance.__class__.objects
# If True then set all others as False
if getattr(model_instance, self.attname):
objects.update(**{self.attname: False})
# If no true object exists that isnt saved model, save as True
elif not objects.exclude(id=model_instance.id)\
.filter(**{self.attname: True}):
return True
return getattr(model_instance, self.attname)
# To use with South
from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^project\.apps\.fields\.UniqueBooleanField"])
models.py
from django.db import models
from project.apps.fields import UniqueBooleanField
class UniqueBooleanModel(models.Model):
unique_boolean = UniqueBooleanField()
def __unicode__(self):
return str(self.unique_boolean)