[英]Django: ValueError when saving an instance to a ForeignKey Field
[英]django updating foreignKey field before saving
我有以下型号。
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_modified
字段。
当我向数据库中添加新页面时,我希望last_modified
字段更新为插入页面时。
我知道我必须通过覆盖Page
类的save
方法来做一些事情。 但是不确定如何从不同的类中获取字段。
您只需在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
上面的答案会有所帮助,但是如果您要在模板中使用表单来添加页面(如果您希望用户添加页面,可能会这样做),那么您将不得不执行一些其他步骤。 在添加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回答一样,如果您使用的是Django> 1.4,只需尝试用self.notebook.save(update_fields=['last_modified'])
替换self.notebook.save()
或者您可以使用post_save
信号
或者,您可以在Page
对象中定义last_modified = models.DateTimeField(auto_now=True)
,并使用简单的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.