Можно ли заказать по аннотации с django TastyPie? - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь упорядочить по количеству поля manyToMany. Есть ли способ сделать это с TastyPie?

Например,

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

Я хочу, чтобы PersonResource выплевывал json, упорядоченный по количеству друзей, которых имеет человек ...

возможно ли это?

Ответы [ 3 ]

2 голосов
/ 28 сентября 2012

Я знаю, что это старый вопрос, но недавно я столкнулся с этой проблемой и нашел решение.

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 (self, request).

2 голосов
/ 17 июня 2013

Мне не удалось получить результаты упорядочения в соответствии с решением coaxmetal, поэтому я решил это другим путем, переопределив get_object_list для объекта Resource согласно http://django -tastypie.readthedocs.org / en./latest/cookbook.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
0 голосов
/ 14 ноября 2011

Я не использовал 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])]

Последняя строка в основном извлекаетПерсоны из отсортированного списка людей, отсортированных по количеству друзей.

`

...