2011-04-16 49 views
0

这一块我的代码自定义可链接查询集

from django.db import models 
from django.db.models.query import QuerySet 
from mptt.models import MPTTModel 
from base.models import Content, OrderedContent 


class ArgumentQuerySet(QuerySet): 
    def statements_with_count(self, *args, **kwargs): 
     from statement.models import Statement 
     statements = Statement.objects.none() 
     result = self 
     for node in result: 
      statements_node = Statement.objects.filter(arguments__in = node.get_descendants(include_self = True), *args, **kwargs).distinct() 
      statements |= statements_node 
      setattr(node, 'count', statements_node.count()) 
     statements = statements.distinct() 
     setattr(result, 'statements', statements) 
     setattr(result, 'count', statements.count()) 
     return result 


class ArgumentManager(models.Manager): 
    def get_query_set(self): 
     return ArgumentQuerySet(self.model) 


class Argument(MPTTModel, OrderedContent): 
    parent = models.ForeignKey('self', null=True, blank=True) 
    objects = ArgumentManager() 

    class MPTTMeta: 
     parent_attr = 'parent' 
     order_insertion_by = ['weight', 'title', ] 

    def __unicode__(self): 
     return self.title 

下面的命令给我的出席结果

a = Argument.objects.filter(title__icontains = 'function') 
b = a.statements_with_count() 

否则,下面的命令不起作用

c = Argument.objects.get(id = 514) 
d = c.get_children() 
e = d.statements_with_count() 

我该如何解决这个问题?

回答

0

MPTT使用TreeManager实例为get_children,它返回models.query.Queryset,而不是您的自定义子类。您chould做somethling,如:

argument = Argument.objects.get(id = 514) 
children_ids = [a.pk for a in argument.get_children()] 
result = Argument.objects.filter(pk__in=children_ids).statements_with_count() 

请注意,您的statements_with_count方法不是很高性能的,因为它会导致对每个对象一个额外的数据库计数。