Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django在保存前更新foreignKey字段_Python_Django_Foreign Keys - Fatal编程技术网

Python django在保存前更新foreignKey字段

Python 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()

我有以下型号。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
很明显,页面属于笔记本,我在
notebook
模型中有
last\u modified
字段

当我向数据库添加新页面时,我希望
last_modified
字段更新到页面插入时间

我知道我必须通过过度使用
Page
类的
save
方法来做一些事情。但不确定如何从不同的类中获取字段。

您只需在
last\u modified
字段中使用,并扩展
页面
model
save
方法,使其调用
笔记本
实例
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