我试图通过计算manyToMany字段来计算是否有办法用TastyPie做到这一点?
例如
class Person(models.Model):
friends = models.ManyToMany(User, ..)
我希望PersonResource吐出一个按照一个人朋友的数量排序的json ......
可能吗?
答案 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])]
最后一行基本上从人员的排序列表中提取人员,按照朋友的号码排序。
`