【问题标题】:Frequent update one filed of django model频繁更新django模型的任意字段
【发布时间】:2011-12-18 10:00:41
【问题描述】:

想象一下,我有 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 后端。

【问题讨论】:

    标签: mysql django django-queryset


    【解决方案1】:

    使用更新但更简洁的方法:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        假设您想在多个模型上使用它(猜测这是因为您将 obj 传递给您的 upd 函数),拥有一些实现 last_visited 字段和 @ 987654324@ 类继承自此类...然后您可以仅在基类上进行更新...另一种可能性是将last_visited 信息放入单独的模型中并通过@ 引用News 模型987654327@ 或 GenericForeignKey(如果您想为不同型号保留“历史记录”)。

        【讨论】:

          猜你喜欢
          • 2020-01-26
          • 2015-09-15
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 2018-05-24
          • 2019-04-06
          • 2015-09-14
          • 1970-01-01
          相关资源
          最近更新 更多