Python 管理Django中的类似模型

Python 管理Django中的类似模型,python,django,django-models,Python,Django,Django Models,考虑一个博客项目。我有一个非常相似的模型,名为Blog和BlogRequest。我想允许个人请求在我的博客中发布他们的内容BlogRequest包含人们请求的所有博客的条目。一个被请求的博客在被接受和发布之前必须经历许多阶段 BlogRequest模型如下所示: class BlogRequest(models.Model): text = ... # TextField author = ... # who created the blog created = ...

考虑一个
博客
项目。我有一个非常相似的模型,名为
Blog
BlogRequest
。我想允许个人请求在我的博客中发布他们的内容
BlogRequest
包含人们请求的所有博客的条目。一个被请求的博客在被接受和发布之前必须经历许多阶段

BlogRequest模型如下所示:

class BlogRequest(models.Model):
    text = ... # TextField
    author = ... # who created the blog
    created = ... # date created
    modified = ... # date modified

    # some other fields


    stage = ... # choicefield
BlogRequest.stage
字段可以包含许多值,如创建、编辑、格式化、审阅、接受、拒绝等。
BlogRequest
实例在被接受之前要经历许多阶段

我现在需要所有接受的
BlogRequest
实例作为
Blog
模型的实例。博客模型应该是
BlogRequest
的子集,还可以包含一些额外的字段,如
liked\u by
disliked\u by
comments

class Blog(models.Model):
    text = ... # TextField
    author = ... # who created the blog
    created = ... # date created
    modified = ... # date modified   

    comments = ... # comments
    liked_by = ... # ManyToManyField
    disliked_by = ... # ManyToManyField

    # some other fields
这种情况可以通过每次
BlogRequest
对象达到
accepted
状态时创建一个Blog实例来处理(信号可以在这里提供帮助)。博客模型所需的额外细节可以在之后通过管理员或使用管理员之外的表单添加


这种方法有缺点,比如(比如)更改博客内容的最大长度将需要更改两种模型中的字段。(编辑:假设出于某些原因,我不希望博客超过2000字,我将不得不对这两种模式进行必要的更改。)因此,我想知道是否有更好的方法来处理类似情况。

嗯,这里没有一刀切的答案,这主要取决于您的工作流程的细节

如果一个
博客
(实际上是一篇
文章
-一个博客是一组文章…)一旦被接受就应该永远保持不变,那么一个模型(用于存储)和一个模型(一个用于请求,另一个用于接受的文章)应该可以工作。实际上,您甚至可以不使用代理模型,但将逻辑分为两个不同的类将使代码更易于使用


现在,如果一个
Blog
一旦被接受就可以更新,然后必须通过整个验证工作流(而最初被接受的版本保持发布),那么最好使用两个不同的模型(使用
Blog
BlogRequest
上有一个ForeignKey,以便您可以关联它们)。然后,您可以通过以下方法避免重复(公共字段)。

处理这种情况的一种更好的方法是:

如果您阅读Django的任何博客教程,您会发现
blog
模型有一个名为
publish
的字段。默认值始终为
false
,除非允许公众查看博客,在这种情况下为
true

在您的情况下,您应该完全删除
BlogRequest
模型,只需使用
Blog
模型即可。并且您的逻辑应该只显示其阶段为
已接受的
的博客


否则,一旦你的博客有很多帖子,你所指出的缺点将会非常令人不安。如果这不是一个解决方案,那么您可以创建一个视图,将stage设置为
accepted
,然后通过复制该特定博客的BlogRequest模型的全部内容来创建一篇博客文章。

您谈论的是
BlogRequest
模型,但发布了一篇带有
Blog
模型的片段,你的问题甚至不清楚
Blog
BlogRequest
应该是什么(我很难理解“#一些常见的Blog字段”,更不用说“更改Blog内容的最大长度”)。你可以使用类继承来重用类似模型的代码。查看关于抽象基类和代理模型的django文档:@brunodesshuilliers我对我的问题进行了编辑,以使其更清楚。