Нормализация моделей 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)
Итак, вы можете создать объект, но чтобы сохранить его в БД, он не должен быть активным, иначе