通过计算特定字段来查找对象的Django-orm Queryset

时间:2018-01-31 12:25:44

标签: django django-orm

假设我有两种模式:

class Testmodel1():
    amount = models.IntegerField(null=True)
    contact = models.ForeignKey(Testmodel2)
    entry_time = models.DateTimeField()
    stage = choicesfiled

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

我想找出过去24小时Testmodel1中创建的contact > 3 last = arrow.utcnow().shift(hours=-24).date()的对象。

我正在申请查询:

n1=Testmodel1.objects.filter(entry_time__gte=last, stage=1).annotate(t_count=Count('contact')).filter(t_count__gt=3)

但它似乎不起作用。因为我得到一个空的查询集。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

只有部分答案。抱歉!你的代码看起来很好,所以我只是试图通过从不同的方向接近它来寻找解决方案。

以下是我在其中一个项目中构建(类似)类似代码的方法。

from datetime import timedelta, date

....
base_date = date.today()
start_date = base_date + timedelta(days=30)
end_date = base_date
possible_holidays = Holiday.objects.filter(
    start_date__lte=start_date, end_date__gte=end_date)

从那里,你可以做一些像:

if possible_holidays.contact_set.count() > 3:
    pass

这有用吗?

答案 1 :(得分:0)

问题是你的多对一关系是倒置的。这种关系是父子关系,父母可以有多个孩子,但孩子只能有一个孩子。在数据库中,此关系存储为子项的ForeignKey字段,该字段指向子项的父项。

在您的情况下,Testmodel1是父级,Testmodel2是小孩(Testmodel1可以有多个Testmodel2代表的联系人)这意味着ForeignKey字段应属于{ {1}},而不是Testmodel2

Testmodel1

使用此模型结构,您可以将class Testmodel1(): amount = models.IntegerField(null=True) entry_time = models.DateTimeField() stage = choicesfiled class Testmodel2(): name = models.CharField() mobile_no = models.ForeignKey() parent = models.ForeignKey(Testmodel1, related_name='contacts', ) 的联系人引用为Testmodel1。您的查询应如下所示:

testmodel1.contacts.all()

docs reference