Python django在保存前更新foreignKey字段
我有以下型号。pyPython django在保存前更新foreignKey字段,python,django,foreign-keys,Python,Django,Foreign Keys,我有以下型号。py class Notebook(models.Model): category = models.ForeignKey(Category) title = models.CharField(max_length=200, help_text='Maximum 250 characters') slug = models.SlugField(unique=True) last_modified = models.DateTimeField()
class Notebook(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=200, help_text='Maximum 250 characters')
slug = models.SlugField(unique=True)
last_modified = models.DateTimeField()
def __unicode__(self):
return self.title
class Page(models.Model):
Notebook = models.ForeignKey(Notebook)
title = models.CharField(max_length=200)
slug = models.SlugField(unique_for_date='pub_date')
tags = TaggableManager()
pub_date = models.DateTimeField(default=datetime.datetime.now)
def __unicode__(slef):
reutrn self.title
很明显,页面属于笔记本,我在notebook
模型中有last\u modified
字段
当我向数据库添加新页面时,我希望last_modified
字段更新到页面插入时间
我知道我必须通过过度使用Page
类的save
方法来做一些事情。但不确定如何从不同的类中获取字段。您只需在last\u modified
字段中使用,并扩展页面modelsave
方法,使其调用笔记本实例save
方法,该方法将自动更新last\u modified
值:
class Notebook(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=200, help_text='Maximum 250 characters')
slug = models.SlugField(unique=True)
last_modified = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.title
class Page(models.Model):
notebook = models.ForeignKey(Notebook)
title = models.CharField(max_length=200)
slug = models.SlugField(unique_for_date='pub_date')
tags = TaggableManager()
pub_date = models.DateTimeField(default=datetime.datetime.now)
def __unicode__(self):
return self.title
def save(self, *args, **kwargs):
instance = super(Page, self).save(*args, **kwargs)
self.notebook.save()
return instance
上面的答案会有所帮助,但如果您想在模板中使用表单来添加页面(如果您想让用户添加页面,您可能会这样做),则必须再执行几个步骤。
在添加views.py的页面部分时,应使用如下代码:
def tek(request, slug):
Notebook = get_object_or_404(Notebook, slug=slug)
form2 = EntryForm(request.POST or None)
if form2.is_valid():
page = form2.save(commit=False)
page.Notebook = Notebook
Notebook.last_modified = page.pub_date
Notebook.save()
return HttpResponseRedirect('/Page/%s'%(page.slug))
ctx = {}
return render(request, "app/page.html", ctx)
我不知道你的应用程序的确切目标,所以我只写了一个响应代码。你应该定制它 你可以像@Gonzalo answer那样做,只要试着用self.notebook.save()替换self.notebook.save(update_fields=['last_modified'])
,如果你使用的是Django>1.4
或者您可以使用post\u save
或者,您可以在页面
对象中定义last\u modified=models.DateTimeField(auto\u now=True)
,并通过简单的orm查询从笔记本
实例获取上次修改。(这取决于您的要求)
我不同意,这个特性最好在模型中实现,这样它就可以在站点管理、RESTAPI和上面的视图之间保持一致。
from django.db.models import Max
class Notebook(models.Model):
category = models.ForeignKey(Category)
title = models.CharField(max_length=200, help_text='Maximum 250 characters')
slug = models.SlugField(unique=True)
def get_last_modified(self):
return self.page_set.aggregate(max=Max('last_modified'))['max']
def __unicode__(self):
return self.title