Как обновить модель, но вернуть неизмененную модель в Django? - PullRequest
3 голосов
/ 07 июня 2011

Я использую django-pneon , чтобы написать веб-сервис RESTful, и у меня возникла проблема.

в 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")

в 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

В обработчике он возвращал определенный статус по id. Теперь я хочу вернуть статус до status.replies.all().update(has_read=True), но также выполнить операцию обновления в базе данных. Как это сделать? Заранее спасибо.

1 Ответ

2 голосов
/ 07 июня 2011

Не уверен, что я понимаю, что вам нужно.Как я понимаю ваш код, status.replies.all().update(has_read=True) не меняет status, а только меняет ответы.Если это правда, код должен делать то, что вы хотите.Если это не так, вы можете сделать копию status и вернуть копию:

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

Или вы просто хотите, чтобы метод возвращался раньше и выполнял обновление базы данных асинхронно?Тогда вы должны взглянуть на сельдерей и, возможно, это хорошее объяснение .

...