想象一下,我有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后端。
答案 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_visited
或News
引用ForeignKey
模型(如果您想为不同的模型保留'历史')。