manyToMany フィールドの数で注文しようとしていますが、TastyPie でこれを行う方法はありますか?
例えば
class Person(models.Model):
friends = models.ManyToMany(User, ..)
PersonResource で友達の数順に並べたjsonを吐き出したい...
それは可能ですか?
manyToMany フィールドの数で注文しようとしていますが、TastyPie でこれを行う方法はありますか?
例えば
class Person(models.Model):
friends = models.ManyToMany(User, ..)
PersonResource で友達の数順に並べたjsonを吐き出したい...
それは可能ですか?
これは古い質問であることは知っていますが、最近この問題に遭遇し、解決策を思いつきました。
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) メソッドをオーバーライドしたりすることもできます。
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
私は 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])]
最後の行は、基本的に、友人の数でソートされた、ソートされた人物のリストから人物を抽出します。
`