Django通过日期操作查询检索结果

时间:2015-01-06 16:59:03

标签: sql django

我有一个模型可以像我这样制作我的目录

class Product(models.Model):
    item = models.CharField(max_length=10)
    description = models.CharField(max_length=140)
    unit = models.CharField(max_length=5)
    expiration= models.IntegerField(default=365) # Days after admission
    expiration_warning= models.IntegerField(default=30) # Days before expiration
    ...

我的库存就像这样:

class Inventory(models.Model):
    product = models.ForeignKey(Product)
    quantity= models.DecimalField(default=0, decimal_places=2, max_digits=10)
    admission = models.DateTimeField(auto_now_add=True)
    ...

现在我想要检索其到期日期即将到来或已到达的所有库存对象。 使用RAW SQL查询,它将类似于:

SELECT product,quantity,admission,expiration,expiration_warning 
FROM Inventory as I JOIN Product as P on I.product=P.id 
WHERE DATEADD(day,(expiration_warning*-1),DATEADD(day,expiration,admission))<=GETDATE()

我还没有尝试过这个查询,它只是一个例子

我想用Django查询语法实现这个目的,你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

也许这样的事情可以实现你所需要的:

from datetime import datetime, timedelta

expiring_inventory = []
expired_inventory = []
for inventory in Inventory.objects.select_related('product').all(): # 1 query
    p = inventory.product

    expire_datetime = inventory.admission + timedelta(days=p.expiration)
    expiring_datetime = expire_datetime - timedelta(days=p.expiration_warning)

    if expiring_datetime <= datetime.now() < expire_datetime: # not quite expired
        expiring_inventory.append(inventory)
    if expire_datetime <= datetime.now(): # expired
        expired_inventory.append(inventory)

您可以在django文档中阅读有关Query Sets的更多信息。