【问题标题】:Django save two models with two foreign keysDjango用两个外键保存两个模型
【发布时间】:2015-12-21 08:39:44
【问题描述】:

一篇文章只能有 1 个当前修订版,但可以有多个历史修订版。每个修订都属于文章。

型号:

class Article(models.Model):
    published = models.BooleanField(default=False)
    current_revision = models.ForeignKey('Revision', related_name='current_revision', blank=False, default=None)

class Revision(models.Model):
    article = models.ForeignKey('Article', null=True)
    title = models.CharField('Title', max_length=250, blank=False, default='(no title)')
    content = RedactorField('Content')
    created_at = models.DateTimeField('Created at', auto_now=True)
    slug = models.SlugField('Slug', blank=False, null=True)

查看:

if article_form.is_valid() and revision_form.is_valid():
    article = article_form.save(commit=False)
    revision = revision_form.save()
    article.current_revision = revision
    article.save()
    print(article)
    revision.article = article
    revision.save()

可以拨打save 3 次吗?或者是否可以通过 2 次保存来保存 2 个模型?

【问题讨论】:

  • 你可以save() 任意多次,我看不出有什么问题。
  • 我认为将 FK 设置为可空修订更有意义。

标签: django django-models foreign-keys


【解决方案1】:

拨打save() 3 次是可以的,但是,关于您的实施。 我认为,您的模型不是代表的最佳方式

一篇文章只能有 1 个当前修订,但历史可以有多个修订

为什么不只是使用一个标志来知道一个修订是否是当前修订,检查属性比在关系之间导航更好

    class Article(models.Model):
        published = models.BooleanField(default=False)

    class Revision(models.Model):
        article = models.ForeignKey('Article', null=True)
        title = models.CharField('Title', max_length=250, blank=False, default='(no title)')
        content = RedactorField('Content')
        created_at = models.DateTimeField('Created at', auto_now=True)
        slug = models.SlugField('Slug', blank=False, null=True)
        current = models.BooleanField(default=True)

#In your views 

if article_form.is_valid() and revision_form.is_valid():
    article = article_form.save()
    #set prior current revision flag to False
    last_current_revision = article.revision_set.filter(current=True)
    last_current_revision.update(current=False)
    revision = revision_form.save()
    revision.article = article
    revision.save()

这样就不会那么混乱了。

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 1970-01-01
    • 2022-01-22
    • 2011-12-04
    • 2010-10-29
    • 2017-10-24
    • 2019-10-06
    • 2016-01-24
    • 2013-03-31
    相关资源
    最近更新 更多