在django中建立一个奇怪的模型?

时间:2011-08-23 06:13:50

标签: django model

这可能很难解释。 我对django和整个模型的想法都有点新鲜。

假设我正在创建一个文章应用,其中每篇文章都有一个创建者,但其他用户可以随意编辑该文章。我对如何为此创建模型有点困难。

首先, 我使用以下内容扩展用户配置文件:

class UserProfile(models.Model):
    #Required field:
    user = models.OneToOneField(User)

    #Other Fields:
    headline = models.CharField()
    industry = models.CharField()
    article= models.ForeignKey(articleModel.article)

这是我感到困惑的第一个地方,我是否将foreignkey字段放在用户模型中?我把它放在这里的原因是因为每篇文章都有很多编辑。

现在这是我的文章模型:

class article(models.Model):
    #primary key is already true
    creator = models.ForeignKey(userModel.UserProfile)
    title = models.CharField()
    text = models.TextField()

在这里,我放置了ForeignKey字段,因此它会与创建者联系起来,因为每篇文章都有一个创建者。 (作为旁注,我确实想要这样做,所以一篇文章可以有多个创作者,但我不知道在这种情况下该怎么做)。 我发现UserProfile模型引用了文章模型有点奇怪,文章正在引用它。有人可以帮助我解开我的大脑吗?

谢谢。 :)

3 个答案:

答案 0 :(得分:1)

尽可能简单

from django.db.models import *
from django.contrib.admin.models import User

# UserProfile should be provided by django-profiles
class UserProfile(User): # Subclassing user creates an automatic 1-1 called user
    headline = CharField()
    industry = CharField()

class Article(Model):
                              # ALWAYS primary key to User, not UserProfile
    creator =      ForeignKey(User, related_name='articles_created')
    contributors = ManyToManyField(User, related_name='articles_edited')
    created =      DateTime(auto_now_add=True)
    modified =     DateTimeField(auto_now=True)
    title =        CharField()
    text =         TextField()
    class Meta:
        order = ['created', 'title']
有趣的东西:

creator = Article.objects.all()[:1][0].creator.getUserProfile().headline

如果你想跟踪编辑,请使用django版本。

class Article(VersionedModel)

编辑:实际上是用户的子类

答案 1 :(得分:0)

这里没什么“怪异”的。这不是数据库结构问题的django问题。您需要阅读表格中的1到1,1到n和n到n之间的关系。

您真的需要录制文章的所有编辑吗?一篇文章有​​很多编辑器,用户可以编辑很多文章,所以这是一个多对多的关系。 Here's how do do it in django

答案 2 :(得分:0)

也许您的文章模型中的另一个字段可以为您提供所需的信息。

lastEditor = models.ForeignKey(userModel.UserProfile)

如果你真的想要保留所有编辑器,你需要实现另一个记录类似的模型:article_id,编辑和编辑时间(如果你对变化感兴趣,甚至可能是文章文本)。然后,您可以根据当前文章查询此medel,以获取所有编辑器的列表。

您可以使用:article_id和creator来获取文章的创建者列表(这将替换UserProfile类中的文章字段)