django在保存之前更新foreignKey字段

时间:2014-07-16 00:42:17

标签: python django foreign-keys

我有以下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方法来做一些事情。但不确定如何从不同的班级获得字段。

3 个答案:

答案 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