Recording a query within a model
I want to write a query in which, if the status Complete is all true, then complete inside the Order model should automatically be true. Can I write a query inside the Order model using some methods or something else? And can you offer any help.
class Order(models.Model):
customer = models.ForeignKey(Customer , on_delete=models.SET_NULL ,
null= True , blank = True)
date_ordered = models.DateTimeField(auto_now_add = True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length= 100 , null=True)
class CompleteStatus(models.Model):
order = models.ForeignKey('Order', on_delete=models.SET_NULL ,
null=True)
seller = models.BooleanField(default=False)
warehouse =models.BooleanField(default=False)
pickup = models.BooleanField(default=False)
delivered = models.BooleanField(default=False)
received_by_customer = models.BooleanField(default=False)
class Order(models.Model):
customer = models.ForeignKey(Customer , on_delete=models.SET_NULL ,
null= True , blank = True)
date_ordered = models.DateTimeField(auto_now_add = True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length= 100 , null=True)
class CompleteStatus(models.Model):
order = models.ForeignKey('Order', on_delete=models.SET_NULL ,
null=True)
seller = models.BooleanField(default=False)
warehouse =models.BooleanField(default=False)
pickup = models.BooleanField(default=False)
delivered = models.BooleanField(default=False)
received_by_customer = models.BooleanField(default=False)
Как я понимаю, вы хотите, чтобы при сохранении объекта CompleteStatus
вы проверяли, все ли булевы поля равны True. Если да, то вы устанавливаете Order.complete
значение True.
В этом случае вы можете просто отредактировать метод save
:
class CompleteStatus(models.Model):
order = models.ForeignKey('Order', on_delete=models.SET_NULL, null=True)
seller = models.BooleanField(default=False)
warehouse = models.BooleanField(default=False)
pickup = models.BooleanField(default=False)
delivered = models.BooleanField(default=False)
received_by_customer = models.BooleanField(default=False)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.order and self.warehouse and self.pickup and self.delivered and self.received_by_customer:
self.order.complete = True
self.order.save(update_fields=['complete'])
Вы также можете сделать:
class Order(models.Model):
...
@property
def complete(self):
if complete_status := self.completestatus
return complete_status.warehouse and complete_status.pickup and complete_status.delivered and complete_status.received_by_customer
print(order.complete)
# True
но тогда вы не сможете фильтровать по значению,