2011-11-14 74 views
2

我想通過計數manyToMany字段來訂購有沒有辦法用TastyPie做到這一點?是否可以通過django TastyPie的註釋進行排序?

例如

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

我想PersonResource吐出由朋友一個人數量排序JSON ...

這可能嗎?

+0

您是否找到任何解決方案?我也有同樣的問題。 – Burak

回答

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])]

最後一行基本上是從人的排序列表中提取的人,上排序一個朋友沒有。

`

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,在查詢集枯萎= ...在Meta類,或者重寫get_object_list(個體經營,request)方法。

2

我無法按照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 
相關問題