有没有一种方法可以从另一个表插入空白的datetimefield?

时间:2020-05-04 16:41:20

标签: python django model

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)


这将如何显示视图?

1 个答案:

答案 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未下任何订单,则为NULLCustomer)。

如果经常需要,可以在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

您当然可以执行额外的过滤。