class Customer(models.Model):
last_purchase = models.DateTimeField(blank=True, null=True)
我有一个空白的DateTimeField,它将用相应表中最后修改的DateTimeField不断更新自身。
class Order(models.Model):
customer = models.ForeignKey(Customer, null=True, on_delete= models.SET_NULL)
date_created = models.DateTimeField(auto_now_add=True, null=True)
这将如何显示视图?
答案 0 :(得分:0)
请不重复数据。存储相同的数据或数据的聚合通常是一种反模式。事实证明,保持数据同步比人们期望的要难。这意味着,如果从Order
创建,更新,删除或更改Customer
,则必须更新相关的Customer
。很容易忽略一些情况,以达到不一致的目的。
通常更好的方法是使用.annotate(..)
注释您的查询集。因此,如果您从客户中删除了last_purchase
字段,而Order
对客户有一个ForeignKey
:
class Customer(models.Model):
# …
class Order(models.Model):
date_created = models.DateTimeField(auto_now_add=True)
customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)
然后我们可以制作一个QuerySet
,如下所示:
from django.db.models import Max
Customer.objects.annotate(
last_purchase=Max('order__date_created')
)
如果None
未下任何订单,则为NULL
(Customer
)。
如果经常需要,可以在Manager
中定义逻辑:
from django.db import models
from django.db.models import Max
class CustomerManager(models.Manager):
def get_queryset(self):
return super().get_queryset(*args, **kwargs).annotate(
last_purchase=Max('order__date_created')
)
class Customer(models.Model):
# …
objects = CustomerManager()
class Order(models.Model):
date_created = models.DateTimeField(auto_now_add=True)
customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)
现在,当您使用Customer.objects
时,它将自动为对象添加注释。
这将使查询如下:
SELECT customer.*
MAX(order.date_created) AS last_purchase
FROM customer
您当然可以执行额外的过滤。