经常更新django模型的任何字段

时间:2011-12-18 10:00:41

标签: mysql django django-queryset

想象一下,我有News个包含许多文字字段的模型

class News(models.Model):

    title = models.CharField(max_length=255)
    subtitle = models.CharField(max_length=255, blank=True)
    lead = models.TextField(max_length=4096)
    content = models.TextField()
    ...
    last_visited = models.DateTimeField()

每次我的News对象输出时,我都会更新last_visited字段:

news.last_visited = datetime.datetime.now()
news.save()

此代码使Django覆盖所有模型字段:

UPDATE news SET title='...', subtitle='...', last_visited = '...' WHERE id = '...';

而不只是一个:

UPDATE news SET last_visited = '...' WHERE id = '...';

我担心它有多糟糕,值得思考。

Django文档提供了查询集更新,但它看起来不是很优雅:

def upd(obj, **kwargs):
    obj.__class__._default_manager.filter(pk=obj.pk).update(**kwargs)

upd(news, last_visited=datetime.datetime.now())

我使用mysql后端。

3 个答案:

答案 0 :(得分:1)

使用更新,但采用更清洁的方法:

class News(models.Model):

    def update_visited(self):
        News.objects.filter(pk=self.pk).update(
                        last_visited=datetime.datetime.now())

答案 1 :(得分:0)

我认为使用queryset update很好。它消除了您意外覆盖对其他字段的更改的可能性。

我知道您担心它看起来不够优雅,但您只需在upd功能中使用一次,然后在视图中使用upd

答案 2 :(得分:0)

假设您想在多个模型上使用它(猜测这是因为您将obj传递给upd函数),有一些实现{{1}的基类可能是有意义的}}字段和你的last_visited类继承自这个类...然后你可以在你的基类上进行更新....另一种可能性是将News信息放入一个单独的模型中通过last_visitedNews引用ForeignKey模型(如果您想为不同的模型保留'历史')。