Нормализация моделей Django
имея такую простую обычную модель
class Order(models.Model):
open = models.DecimalField(max_digits=10, decimal_places=8)
high = models.DecimalField(max_digits=10, decimal_places=8)
low = models.DecimalField(max_digits=10, decimal_places=8)
close = models.DecimalField(max_digits=10, decimal_places=8)
time = models.DateTimeField()
active = models.BooleanField(default=False)
complete = models.BooleanField(default=False)
работает для моего случая, но так как есть только до 1 заказа active одновременно, поддержание последовательности является сложной задачей. не хочу использовать transaction, поэтому идея разделения атрибута active была бы решением. Мне интересно, есть ли идеи получше? Например, добавить active как атрибут, связанный с базой данных, или что-то вроде крючка (поверьте мне, когда я говорю, что не знаю, есть ли такая возможность)
Вы можете использовать UniqueConstraint [Django-doc] для обеспечения того, чтобы не более одного Order имело active=True:
from django.db.models import Q
class Order(models.Model):
# …
active = models.BooleanField(default=False)
class Meta:
constraints = [
models.UniqueConstraint(
fields=('active',),
condition=Q(active=True),
name='at_most_one_active'
)
]
как насчет проверки этого перед сохранением
class Order(models.Model):
...
def save(self,*args,**kwargs):
if self.active: # then will check in the DB
objs = self.__class__.objects.filter(...).values_list(flat=True) # put your filters
if any(objs): # check if there is any True Value
raise MultiActiveOrdersError("Only On Order Can be Active")
else :
super().save(*args,*kwargs)
Итак, вы можете создать объект, но чтобы сохранить его в БД, он не должен быть активным, иначе