这可能很难解释。 我对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模型引用了文章模型有点奇怪,文章正在引用它。有人可以帮助我解开我的大脑吗?
谢谢。 :)
答案 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类中的文章字段)