繁体   English   中英

Django在保存之前更新foreignKey字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM