4

模型定义:

class Footprint(models.Model)
  date = models.DateTimeField(auto_now = True)

class Stuff(Footprint):
  name = models.CharField(max_length = 255)
  some_other_field = models.CharField(max_length = 255)

在一个Stuff对象中,我只想更新该name字段,并保持所有其他字段不变,除了关联Footprint对象中定义的字段。

Footprint如果我不使用,对象中的字段会正确更新update_fields

s = Stuff.objects.get(pk = 1)
s.name = 'Alexander'
s.save()

s.date # is correctly set

但是,如果我指定要更新的字段,则关联Footprint的甚至都不会保存。

s = Stuff.objects.get(pk = 1)
s.name = 'Tim'
s.save(update_fields = ['name'])

s.date # unfortunately, remains unchanged!!

我必须使用update_fields以避免几个脚本之间的干扰。

同时,我想始终跟踪由“足迹”对象定义的上次修改(它包含上次修改日期以及其他几个字段;它们的更新由自定义触发save()方法触发)。

有没有办法强制调用,Footprint.save()即使update_fields不包含来自的任何字段Footprint

4

3 回答 3

8

除了重写save()方法之外,另一种可能性是将所有带有auto_now选项的字段添加到update参数中。像这样:

some_object.save(update_fields = ['updated_field', 'auto_now_date']
于 2015-09-29T11:14:05.167 回答
2

像这样简单地重写足迹模型定义就足够了:

class Footprint(models.Model)
  date = models.DateTimeField(auto_now = True)

  def save(self, *args, **kwargs):
    if kwargs.has_key('update_fields'):
      kwargs['update_fields'] = list(set(list(kwargs['update_fields']) + ['date']))

    return super(Footprint, self).save(*args, **kwargs)

当然,如果您要更新的字段不仅仅是一个date字段,您只需将它们附加到列表中。

于 2013-07-09T05:47:53.153 回答
0

你可以通过改变你的.save()方法来做到这一点。现在,我现在确定你到底想要做什么,所以我会给你一个模板,因为我相信想要有你自己的保存更改的方式确实是你想要的。

在你的类中添加这个函数定义:

def save(self, *args, **kwargs):
    # Do something here, whatever it is that you want
    return super(<YourClassName>, self).save(self, *args, **kwargs)

这将保持正常save()功能的功能不变,并将您的自定义更改添加到您想要进行的更改中。

于 2013-07-04T17:16:41.980 回答