Tastypie — набор запросов или фильтры

Я использую tastypie и столкнулся с проблемой.

Моя проблема:

Пользователи могут публиковать сообщения, и если другие пользователи подписаны на этого пользователя, они могут видеть это сообщение на своей домашней странице. Это точно так же, как пользователи Twitter, которые пишут твиты, и подписчики, просматривающие их твиты.

У меня есть общедоступный API для всех сообщений.
Я могу фильтровать сообщения определенных пользователей, используя ?userid=1

Плохое решение проблемы:
я могу отфильтровать сообщения нескольких пользователей (и, таким образом, решить проблему), используя
?userid__in=1&userid__=5&...

Но это не лучший способ, потому что длина URL-адреса может увеличиться до недопустимой величины. (2000 символов)

Есть ли лучший способ сделать это?
Можно ли использовать request.user в наборе запросов для соединения?
Или мне следует использовать какой-то тип расширенная фильтрация?

Спасибо!


person nknj    schedule 11.07.2012    source источник


Ответы (2)


Tastypie уже поддерживает это через фильтрацию __in (все, что ORM поддерживает Tastypie, показывает все, кроме отрицаний). Кодирование не требуется.

Посмотрите здесь: http://django-tastypie.readthedocs.org/en/v0.9.11/resources.html#basic-filtering

path/to/api/resource/?user_id__in=1,2,3,4,5,6

Тем не менее, у вас все еще может быть проблема с тем, что ваш URL-адрес становится огромным, когда кто-то подписан на многих пользователей. Вместо этого вы можете сохранить эту информацию в модели БД (какой пользователь подписан на какого пользователя как рекурсивное отношение ManyToMany в модели через отдельную совместную модель).

Затем вы можете раскрыть это через свой ресурс, даже не указывая подписки через свой URL-адрес в качестве параметра и/или фильтра. Вместо этого ваш базовый набор запросов в ресурсе будет таким:

userids = request.user.subscription_userset.values(id)

при условии, что у вас есть self ManyToManyRelationship в вашей User модели. Посмотрите здесь и здесь.

person astevanovic    schedule 12.07.2012

Что, если бы вы попросили кого-то передать список user_ids, для которых он хочет видеть обновления, а затем отфильтровать его? Что-то вроде этого:

URL: your/api/messages.json?user_ids=5,8,10,25

А затем в коде вы преобразовали бы это в фактический список и запросили бы:

Message.objects.filter(user__id__in=user_ids)

person girasquid    schedule 11.07.2012
comment
Спасибо! Любая идея, как я могу сделать это с помощью deliciouspie? - person nknj; 12.07.2012
comment
Нет, но похоже, что это даст вам хорошую отправную точку: django-tastypie.readthedocs.org/en/latest/ - person girasquid; 12.07.2012