Django将模型实例传递给略有不同的模型

时间:2009-11-23 12:19:25

标签: python django

我正在为一个项目编写一个django应用程序,每个人都可以更改文章,但用户提交的更改必须在某人上线之前查看。所以你看它有点像维基百科使用的系统。

class Content(models.Model):
    tp = models.DateTimeField(auto_now_add=True)
    topic = models.CharField(max_length=60)
    content = models.TextField()
    slug = models.SlugField(max_length=80)

class ChangeSet(Content):
    content = models.ForeignKey('Content')
那些是我的模特。 ChangeSet只是继承了内容,它有一个原始内容的ForeignKey。

我的问题是如何保存我的ChangeSet?

def content(request, content_slug):
    content = get_object_or_404(Content, slug=content_slug)
    if request.method == 'POST':
        new_content = ContentModelForm(request.POST, instance=content)

        new_content = new_content.save(commit=False)

        changeset = ChangeSet(content=content)

我可以以某种方式传递ChangeSet的内容实例吗? Django是否认识到除了fk之外这两个模型是相同的? 或者我必须手动添加每个字段,如:

changeset.topic = new_content.topic

编辑#1

看起来像'changeset.topic = new_content.topic'并不是什么大不了的事,但是我缩短了我的真实内容模型,所以你们不必阅读与解决这个问题无关的所有内容问题

编辑#2

更多地概括这个问题。 保存变更集的最佳方法是什么? 像我一样为变更集创建一个新模型,或者我应该添加一个带有对自己的引用的ForeignKey到我的内容模型?

1 个答案:

答案 0 :(得分:1)

您对模型编码的方式,我认为它不会像您期望的那样工作。在这种情况下,ChangeSet继承自Content。 Django实现这一点的方法是创建一个连接ChangeSet和Content的OneToOneField。这意味着您的应用程序有两件事:

  1. 拥有ForeignKey是没有意义的,就像对自己有一个FK(并且幕后已经有一个OneToOne)
  2. ChangeSet始终指向最新的内容实例。此模型设置中没有任何内容可以保存更改副本。
  3. 我见过的最好的方法(由django-reversion使用)可能是获取内容,序列化它,然后将内容ID和内容类型保存到模型中。您可以像ChangeSet.original一样访问它。{tp / topic / etc.}。

    在这里查看它的型号代码:models.py。与ChangeSet等效的是Version模型。