2013-07-21 5 views
1

Я использую Django-Tastypie для создания API REST для моей модели Django. Моя тестовая модель пользователя имеет следующие поля.Изменить данные перед сохранением Django-tastypie

user_id  models.AutoField(primary_key=True) 
user_name  models.CharField(max_length=200, db_index=True) 
user_rating models.IntegerField(default=0) 

Здесь я хочу написать API, который по запросу, надбавки рейтинг пользователя каждый раз на 1. В настоящее время я поддерживаю кумулятивный рейтинг, и я знаю, как мы можем переписать рейтинг, но не уверен, о том, как мы можем изменить данные перед вставкой, чтобы следующее значение было на 1 больше предыдущего.

Я уже просмотрел документацию Django-Tasypie, чтобы проверить, есть ли какое-либо прямое решение, и попробовал prepend_url, чтобы изменить запрос, но не знаете, как мы можем получить текущий рейтинг и обновить его.

+0

Умеешь ли ты быть более конкретным? Что значит: «по запросу, увеличивает рейтинг пользователя каждый раз на 1»? Вы имели в виду, каждый раз, когда вы обновляете пользовательский ресурс, вы обновляете user_rating на 1 или каждый раз, когда вы специально запрашиваете обновление user_rating на 1. – ge7600

+0

@ ge7600, например. Мы можем сказать, что это своего рода функция, такая как stackoverflow, где для каждого вопроса/ответа stackoverflow поддерживает подсчет upvote и когда новый пользователь приходит и делает upvote, счет увеличивается на единицу. Теперь я понимаю, что я имел в виду? – lalit

ответ

0

OK. Вы имели в виду, что если вы обновите resource1, вы обновите поле user_rating ресурса пользователя. Вы можете переопределить метод сохранения модели django модели 1, который связан с resource1.

class Model1(models.Model): 
     user = models.ForeignKey('User') 
     id = models.BigIntegerField() 
     name = models.CharField(max_length=255L) 
     class Meta: 
      db_table = 'table1' 
     def save(self, *args, **kwargs): 
      super(Model1, self).save(*args, **kwargs) 
      self.user.user_rating += 1 
      self.user.save() 
+0

Привет, ge7600, спасибо за ваш ответ. Решение выглядит хорошо, но это увеличит рейтинг пользователя на единицу для всех обновлений, которые не являются чем-то нужным для приложения. Он должен обновлять только это поле, не затрагивая других. – lalit

0

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

Вот как выглядит мой UserResource.

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'user' 

    def prepend_urls(self): 
     Return [ 
      url(r"^(?P<resource_name>%s)/(?P<user_id>\w[\w/-]*)/upvote%s$" % 
       (Self. _meta. resource_name, trailing_slash()), 
       self.wrap_view('upvote_user'), name="api_user_upvote"), 
     ] 

    def upvote_user(self, request, **kwargs): 
     self.method_check(request, allowed=['get']) 
     self.is_authenticated(request) 
     self.throttle_check(request) 

     try: 
      basic_bundle = self.build_bundle(request=request) 
      obj = self.cached_obj_get(bundle=basic_bundle, 
             **self.remove_api_resource_names(kwargs)) 
     except ObjectDoesNotExist: 
      return HttpGone() 
     except MultipleObjectsReturned: 
      return HttpMultipleChoices("More than one resource is found at this URI.") 

     user_manager_obj = UserManager() 
     return self.create_response(request, user_manager_obj.upvote_user(obj.user_id)) 

и написал еще один метод в моем классе UserManager выполнять upvote операцию на User модели.

def upvote_user(self, user_id): 
    try: 
     user = User.objects.get(id=user_id) 
     user.user_rating += 1 
     user.save() 
    except: 
     # Handle Exception 
     return False 

    return True 

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

Thanks

Смежные вопросы