2011-06-07 3 views
3

J'utilise django-piston pour écrire un service Web RESTful et j'ai un problème.Comment mettre à jour un modèle mais retourner un modèle non modifié dans Django?

en models.py:

class Status(models.Model): 
    user = models.ForeignKey(User) 
    content = models.TextField(max_length=140) 

class StatusReply(models.Model): 
    user = models.ForeignKey(User) 
    reply_to = models.ForeignKey(Status, related_name='replies') 
    content = models.TextField(max_length=140) 
    has_read = models.BooleanField(default=False, help_text="has the publisher of the status read the reply") 

dans handlers.py:

class StatusHandler(BaseHandler): 
    allowed_methods = ('GET', 'POST', 'DELETE') 
    model = Status 
    fields = ('id', 
       ('user', ('id', 'username', 'name')), 
       'content', 
       ('replies', ('id', 
          ('user', ('id', 'username', 'name')), 
          'content', 
          'has_read'), 
      ), 
      ) 

    @need_login 
    def read(self, request, id, current_user): # the current_user arg is an instance of user created in @need_login 
     try: 
      status = Status.objects.get(pk=id) 
     except ObjectDoesNotExist: 
      return rc.NOT_FOUND 
     else: 
      if status.user == current_user: #if current_user is the publisher of the status, set all replies read 
       status.replies.all().update(has_read=True) 
      return status 

Dans le gestionnaire, il a renvoyé un état spécifique par identifiant. Maintenant, je veux retourner l'état avant status.replies.all().update(has_read=True) mais aussi faire l'opération de mise à jour dans la base de données. Comment faire? Merci d'avance.

Répondre

2

Je ne sais pas si je comprends ce dont vous avez besoin. Si je comprends votre code, status.replies.all().update(has_read=True) ne change pas status mais ne modifie que les réponses. Si c'est vrai, le code devrait faire ce que vous voulez. Dans le cas contraire, vous pouvez faire une copie de status et retourner la copie:

 if status.user == current_user: 
      old_status = status.make_copy() 
      status.replies.all().update(has_read=True) 
      return old_status 
     return status 

Ou vous voulez juste la méthode pour revenir au début et faire la mise à jour de la base de données de manière asynchrone? Ensuite, vous devriez jeter un oeil à celery et peut-être this nice explanation.

Questions connexes