在Django中使用类方法进行查询

时间:2013-11-21 06:56:38

标签: python django django-models django-views django-queryset

我试图用这种方式,

models.py

class Father(models.Model):
      name = models.CharField(...)

      def last_child_age(self):
          children = self.child.order_by('-pk')
          if len(children) > 0:
             return find_Year(datetime.datetime.now()-children[0].birth_day) 
          return -1


class Child(models.model):
          father = models.ForeignKey(Father, related_name='child')
          birth_day = models.DateTimeField(auto_now_add=True)

views.py

def get_old_fathers(request):
     father_list = Father.objects.filter(last_child_age__gte=15)

返回:

   Cannot resolve keyword 

错误。

除了逐个迭代之外,进行此查询的正确方法是什么。

3 个答案:

答案 0 :(得分:0)

你还没有发布你的Child模型和last_child_age代码,但这样的事情应该有效:

Child.objects.filter(age__gte=15).prefetch_related('father')

答案 1 :(得分:0)

last_child_age是方法,而不是列。 ORM查询生成SQL,SQL不知道zilch关于模型方法 - SQL数据库将如何回调Python代码?

答案 2 :(得分:0)

您无法在Django中使用模型类方法(将函数传递给过滤器)进行查询

如果您需要包含年龄> gt的孩子的Father个对象列表; 15年:

d = datetime.date.today()
father_list = Father.objects.filter(
    child__birth_day__lte=datetime.date(d.year-15, d.month, d.day))

在不向Child添加标志的情况下,您可以通过向子表创建子查询来确定哪个是最后的(最小的)。最大生日的注释(最后一个儿子 - >更大的birth_day日期)可以提供帮助。试试这个查询(我不测试它):

from django.db.models import Max
father_list = Father.objects.annotate(max_birthday=Max('child__birth_day')
    ).filter(max_birthday__lte=datetime.date(d.year-15, d.month, d.day))