Нормализация моделей 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)

Итак, вы можете создать объект, но чтобы сохранить его в БД, он не должен быть активным, иначе

Вернуться на верх