用于计算最近一天创建的对象的查询集
Queryset for counting the object created for last one day
假设我有两个模型
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)
。现在我想通过 mobile_no
字段找出过去 24 小时内创建的对象 (Testmodel2)
的计数。
最好的查询方式是什么。
如有任何帮助,我们将不胜感激。
最好将联系人字段设为 models.DateTime
字段而不是 models.CharFiel
d。如果它是 DateTime 字段,您可以轻松地对其执行 lte、gte 和其他操作,以将其与其他日期时间进行比较。
例如,如果 Testmodel.contact 是 DateTime 字段,则您问题的答案将是:
Testmodel.objects.filter(contact__gte=past).count()
如果联系人字段包含表示日期时间的字符串,我建议将其切换,因为确实没有理由将其存储为字符串。
如果您无法更改这些字段,很遗憾,我认为没有办法在数据库级别执行此操作。您必须在 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)
假设我有两个模型
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)
。现在我想通过 mobile_no
字段找出过去 24 小时内创建的对象 (Testmodel2)
的计数。
最好的查询方式是什么。
如有任何帮助,我们将不胜感激。
最好将联系人字段设为 models.DateTime
字段而不是 models.CharFiel
d。如果它是 DateTime 字段,您可以轻松地对其执行 lte、gte 和其他操作,以将其与其他日期时间进行比较。
例如,如果 Testmodel.contact 是 DateTime 字段,则您问题的答案将是:
Testmodel.objects.filter(contact__gte=past).count()
如果联系人字段包含表示日期时间的字符串,我建议将其切换,因为确实没有理由将其存储为字符串。
如果您无法更改这些字段,很遗憾,我认为没有办法在数据库级别执行此操作。您必须在 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)