Как отфильтровать объекты по идентификатору пользователя при помощи вкусного пирога? - PullRequest
3 голосов
/ 27 марта 2012

У меня есть следующий пользовательский ресурс:

class UserResource(ModelResource):
  class Meta:
    queryset = User.objects.all()
    resource_name = 'user'
    fields = ['username', 'first_name', 'last_name']
    allowed_methods = ['get']
    filtering = {
      'username': ALL,
      'id': ALL,
    }

и следующий ресурс модели:

class GoalResource(ModelResource):
  user = fields.ForeignKey(UserResource, 'user')

  class Meta:
    #authentication = BasicAuthentication()
    #authorization = ReadOnlyAuthorization()
    queryset = Goal.objects.all()
    resource_name = 'goal'
    filtering = {
      'user': ALL_WITH_RELATIONS,
    }

Я хочу иметь возможность фильтровать цель по идентификатору пользователя, а не имени пользователя.

Я могу получить список целей по определенным именам пользователей, выполнив запрос GET по этому адресу:

http://localhost:8000/api/v1/goal/?user__username=test

Но вместо этого я хочу иметь возможность сортировки по идентификатору пользователя:

http://localhost:8000/api/v1/goal/?user__id=1

Как заставить работать вторую часть?

Кроме того, какова общая процедура доступа к идентификатору пользователя, вошедшего в систему в данный момент через Javascript?Я использую backbonejs, и я хочу сделать сообщение для всех целей вошедшего в систему пользователя.Я думал о размещении скрытого поля на странице с идентификатором пользователя.Затем извлекая значение скрытого поля из DOM, но я подумал, что легко использовать инструменты разработчика Chrome для изменения идентификатора, когда я захочу.Конечно, я буду использовать аутентификацию, чтобы проверить, совпадает ли идентификатор зарегистрированного пользователя с тем, который я извлекаю из скрытого поля.Но какой путь принят?

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

Я не уверен, что то, что я предлагаю здесь, может работать в вашем разрешении.Это работает для меня, используя ApiKeyAuthorization и авторизацию.

Я прочитал эту идею по адресу: http://django -tastypie.readthedocs.org / en / latest / cookbook.html [Раздел: Создание ресурсов для каждого пользователя]

Мое предложение:

Как насчет того, чтобы раскомментировать аутентификацию и авторизацию и переопределить obj_create и apply_authorization.Я использую это в своем проекте, и это работает.В коде метода apply_authorization я просто добавил проверку условия if для суперпользователя, вы можете просто вернуть фильтр object_list + без проверки этого (я делаю это, потому что если не суперпользователь, я возвращаю данные, относящиеся к группам пользователей).

class GoalResource(ModelResource):
  user = fields.ForeignKey(UserResource, 'user')

  class Meta:
    authentication = BasicAuthentication()
    authorization = ReadOnlyAuthorization()
    queryset = Goal.objects.all()
    resource_name = 'goal'
    filtering = {
      'user': ALL_WITH_RELATIONS,
    }

   def obj_create(self, bundle, request=None, **kwargs):
       return super(EnvironmentResource, self).obj_create(bundle, request, user=request.user)


   def apply_authorization_limits(self, request, object_list):
       if request.user.is_superuser:
           return object_list.filter(user__id=request.GET.get('user__id',''))

Надежда - это то, о чем вы просили, и это помогает.лучше всего с этим!

1 голос
/ 06 июня 2013

Примечание. - apply_authorization_limits устарела.

Альтернативный способ фильтрации по текущему пользователю - переопределить read_list в вашем классе авторизации. Это то, что у меня есть. Мой класс отвергает DjangoAuthorization.

 def read_list(self, object_list, bundle):
    klass = self.base_checks(bundle.request, object_list.model)

    if klass is False:
        return []

    # GET-style methods are always allowed.

    # Filter by user
    if not hasattr(bundle.request, 'user'):
        return None

    object_list = object_list.filter(user__id=bundle.request.user.id)

    return object_list
...