2

manyToMany フィールドの数で注文しようとしていますが、TastyPie でこれを行う方法はありますか?

例えば

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

PersonResource で友達の数順に並べたjsonを吐き出したい...

それは可能ですか?

4

3 に答える 3

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 クラスの queryset=... でウィザーを追加したり、get_object_list(self,request) メソッドをオーバーライドしたりすることもできます。

于 2012-09-28T17:47:54.450 に答える
2

coaxmetal のソリューションに従って結果を並べ替えることができなかったので、別の方法でこれを解決しました。 .html . 基本的に、'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
于 2013-06-17T03:46:37.670 に答える
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])]

最後の行は、基本的に、友人の数でソートされた、ソートされた人物のリストから人物を抽出します。

`

于 2011-11-14T05:01:52.090 に答える