我有以下models.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()
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
很明显,一个页面属于笔记本,我在last_modified
模型中有Notebook
字段。
当我向我的数据库添加新页面时,我希望last_modified
字段更新为插入页面的时间。
我知道我必须通过覆盖save
类的Page
方法来做一些事情。但不确定如何从不同的班级获得字段。
答案 0 :(得分:0)
您只需在last_modified
字段中使用auto_now
并扩展Page
模型save
方法,即可调用Notebook
实例save
将自动更新last_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
答案 1 :(得分:0)
上面的答案会有所帮助,但如果您要在模板中使用表单添加页面(如果您希望用户添加页面,可能会这样做),您将需要执行更多步骤。 在添加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)
我不知道你的应用程序的确切目标,所以我只写了一个spont代码。你应该自定义它。
答案 2 :(得分:0)
你可以像@Gonzalo一样回答,如果你使用Django>尝试用self.notebook.save()
替换self.notebook.save(update_fields=['last_modified'])
1.4
或者您可以使用post_save
signal
或者您可以在last_modified = models.DateTimeField(auto_now=True)
对象中定义Page
,并使用简单的orm查询从NoteBook
实例获取最后一次修改。 (这取决于您的要求)
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