是否可以通过django TastyPie的注释订购?

时间:2011-11-14 03:22:03

标签: django django-models django-aggregation tastypie

我试图通过计算manyToMany字段来计算是否有办法用TastyPie做到这一点?

例如

class Person(models.Model):
    friends = models.ManyToMany(User, ..)

我希望PersonResource吐出一个按照一个人朋友的数量排序的json ......

可能吗?

3 个答案:

答案 0 :(得分:2)

我知道这是一个老问题,但我最近遇到了这个问题,并想出了一个解决方案。

Tastypie不容易允许自定义排序,但很容易修改它使用的查询集。 我实际上只是使用自定义管理器修改了模型的默认查询集。

例如:

class PersonManager(models.Manager):
    def get_query_set(self):
        return super(PersonManager self).get_query_set().\
            annotate(friend_count=models.Count('friends'))

class Person(models.Model):
    objects = PersonManager()
    friends = ...

您还可以在Tastypie中添加注释,在Metaset的queryset = ...中删除,或者覆盖get_object_list(self,request)方法。

答案 1 :(得分:2)

我无法按照coaxmetal的解决方案获得结果排序,所以我通过按http://django-tastypie.readthedocs.org/en/latest/cookbook.html覆盖Resource对象上的get_object_list,以不同的方式解决了这个问题。基本上,如果存在'top'查询字符串参数,则返回有序结果。

class MyResource(ModelResource):
    class Meta:
        queryset = MyObject.objects.all()

    def get_object_list(self, request):
        try:
            most_popular = request.GET['top']
            result = super(MyResource, self).get_object_list(request).annotate(num_something=Count('something')).order_by('num_something')
        except:
            result = super(MyResource, self).get_object_list(request)
        return result

答案 2 :(得分:0)

我没有使用过TastyPie,但你的问题似乎更普遍。您不能在Django ORM查询中进行自定义排序。你最好存储表单的元组(Person,friend_count)。这很简单:

p_list = []
for person in Person.objects.all():
    friendcount = len(person.friends.all())
    p_list.append((person, friendcount))

然后,您可以使用内置的sorted函数,如下所示:

sorted_list = [person for (person, fc) in sorted(p_list, key=lambda x: x[1])]

最后一行基本上从人员的排序列表中提取人员,按照朋友的号码排序。

`

相关问题