Tastypie obj_create - как использовать вновь созданный объект?

Когда новый элемент создается с помощью Tastypie, я хочу иметь возможность добавить его в атрибут пользователя, который является полем «многие ко многим». Прямо сейчас мой obj_create выглядит так:

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

Я хочу создать новый объект, но когда я хочу иметь возможность добавить его в атрибут target_list запроса. Но то, что у меня есть, сразу создаст объект в базе данных. Как мне создать объект, а затем добавить его в атрибут target_list пользователя?


person egidra    schedule 09.04.2012    source источник


Ответы (2)


Вы не показали нам свое определение ресурса, но если вы используете tastypie.resources.ModelResource в качестве базового класса, это должно работать:

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

    user = request.user
    user.goals.add( bundle.obj )
    user.save()
    return bundle

Это связано с тем, что метод obj_create класса ModelResource возвращает пакет, содержащий сохраненный объект (bundle.obj), и вы можете манипулировать этим объектом в своем методе obj_create, как показано, и только затем возвращать его.

Я также предположил, что request.user содержит действительный объект User (т. е. аутентифицированный), вам нужно убедиться, что он работает, или вы должны добавить код обработки ошибок для случая, когда это не так.

Надеюсь это поможет :)

person kgr    schedule 09.04.2012

У меня пока недостаточно репутации, чтобы комментировать, поэтому я решил поставить второй ответ. Ответ выше правильный, я просто хотел добавить, что запрос больше не существует в вызове obj_create. Вы можете получить доступ к текущему запросу через bundle.request:

http://django-tastypie.readthedocs.org/en/latest/resources.html#accessing-the-current-request

Спасибо за ответ выше, мне тоже помогло!

person Tim    schedule 11.02.2014
comment
Из-за этого ответы везде нужно обновлять :) - person teewuane; 25.09.2015