2011-11-14 9 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)を保存する方が良いです。これは非常に簡単です:最後の行は、基本的にソートし、人のソートされたリストから人を抽出し

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

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

、あなたはとても似sorted機能で構築を使用することができます友人の何人も持っていない。

`

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で注釈を追加するメタクラスに= ...クエリセットに枯れ、またはget_object_list(自己、リクエスト)メソッドをオーバーライドすることができます。

2

私はcoaxmetalのソリューションとして注文を得ることができませんでしたので、http://django-tastypie.readthedocs.org/en/latest/cookbook.htmlとしてResourceオブジェクトのget_object_listをオーバーライドすることで、これを別の方法で解決しました。基本的に、「トップ」クエリーストリング・パラメーターが存在する場合、順序付けられた結果が戻されます。

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 
関連する問題