用于计算最近一天创建的对象的Queryset

时间:2018-01-30 20:01:17

标签: django django-orm

假设我有两个型号

class Testmodel1():
   amount = models.IntegerField(null=True)
   contact = models.CharField()
   entry_time = models.DateTimeField()

class Testmodel2():
   name = models.CharField()
   mobile_no = models.ForeignKey(Testmodel1)

我正在为此模型(Testmodel2)创建对象。现在我想找出(Testmodel2)字段在过去24小时内创建的对象mobile_no的数量。

什么是最好的查询方式。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您将联系人字段设置为models.DateTime字段而不是models.CharFiel d,那就更好了。如果它是一个DateTime字段,你可以轻松地对它进行lte,gte和其他操作,以便将它与其他日期时间进行比较。

例如,如果Testmodel.contact是DateTime字段,那么您问题的答案将是:

Testmodel.objects.filter(contact__gte=past).count()

如果联系人字段包含表示DateTime的字符串,我建议将其切换,因为没有理由将其存储为字符串。

如果您无法更改这些字段,遗憾的是我认为在数据库级别上无法做到这一点。您必须在python端单独过滤它们:

from dateutil.parser import parse

results = []
past = arrow.utcnow().shift(hours=-24)
model_query = TestModel.objects.all()
for obj in model_query.iterator():
  contact_date = parse(obj.contact)  # Parse string into datetime
  if contact_date > past:
    results.append(obj)
print(len(results))

这将为您提供包含所有匹配模型实例的列表(注意:不是查询集)。它会比其他选项慢很多,之后您可以使用results.filter(amount__gte=1).count()之类的内容编辑结果,而且它不太干净。

那就是说,它将完成工作。

修改 我发现这个可能能够完成注释,但我不确定如何实现,或者它是否可行。如果他们能够想出一种方法来使用注释以更好的方式实现这一点,我会推迟其他答案,但坚持我原来的评估,这应该是一个DateTime字段。

编辑2 现在,在其他模型上添加了DateTime字段,您可以在以下模型中查找:

past = arrow.utcnow().shift(hours=-24)
Testmodel2.objects.filter(mobile_no__entry_time__gte=past)