我想通過計數manyToMany字段來訂購有沒有辦法用TastyPie做到這一點?是否可以通過django TastyPie的註釋進行排序?
例如
class Person(models.Model):
friends = models.ManyToMany(User, ..)
我想PersonResource吐出由朋友一個人數量排序JSON ...
這可能嗎?
我想通過計數manyToMany字段來訂購有沒有辦法用TastyPie做到這一點?是否可以通過django TastyPie的註釋進行排序?
例如
class Person(models.Model):
friends = models.ManyToMany(User, ..)
我想PersonResource吐出由朋友一個人數量排序JSON ...
這可能嗎?
我沒有使用過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])]
最後一行基本上是從人的排序列表中提取的人,上排序一個朋友沒有。
`
我知道這是一個老問題,但最近我遇到了這個問題,並解決了上來。
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,在查詢集枯萎= ...在Meta類,或者重寫get_object_list(個體經營,request)方法。
我無法按照coaxmetal的解決方案獲得結果排序,所以我通過覆蓋Resource對象上的get_object_list按照http://django-tastypie.readthedocs.org/en/latest/cookbook.html來解決這個問題。基本上,如果'top'querystring參數存在,那麼返回有序的結果。
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
您是否找到任何解決方案?我也有同樣的問題。 – Burak