2011-08-23 14 views
0

這可能很難解釋。 我對django和模型的整個想法有點新。在django中設置一個奇怪的模型?

假設我正在製作一篇文章應用程序,其中每篇文章都有一個創作者,但其他用戶可以隨意編輯文章。我在如何爲此創建模型方面有點困難。

首先, 我用下面的擴展用戶配置文件:

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

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

這是第一個地方,我越來越糊塗,我把外鍵字段在用戶模式?我把它放在這裏的理由是因爲每篇文章都可以有許多編輯。

現在,這裏是我的文章型號:

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

過來,我把ForeignKey的領域,因此將涉及回的創造者,是因爲每一篇文章都有一個創造者。 (作爲一個方面說明,我確實想讓它成爲一篇文章可以有多個創作者,但我不知道在這種情況下該做什麼)。 我發現UserProfile模型引用文章模型並且文章引用它時有點奇怪。有人可以幫助我,讓我的腦子不受歡迎嗎?

謝謝。 :)

回答

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版本的considder,如果你想跟蹤編輯。

class Article(VersionedModel)

編輯:其實子類用戶

+0

有趣。這真的很有幫助。爲了確保,我不需要UserProfile中的一對一字段?因爲我正在研究擴展用戶模型的django教程,並且他們表明它在那裏是必需的。而且,使用用戶作爲主鍵更有意義。再次感謝你。 – de1337ed

0

這裏沒有什麼「怪事」。這不是一個數據庫結構問題的django問題。您需要閱讀大約1到1,1到n和n到n表之間的關係。

你是否真的需要記錄所有文章的編輯?一篇文章有​​許多編輯,用戶可以編輯許多文章,所以這是一種多對多的關係。 Here's how do do it in django

+0

雅,你猜我得對那些讀了。我在何處定義多對多的領域是否重要?我只是想用多對多字段替換userProfile中的「article」屬性。另外,如果我仍然想跟蹤創作者,那麼我是如何設置「創作者」屬性的?就像我打算跟蹤創作者和編輯一樣。 – de1337ed

+0

'creator'屬性是正確的,因爲這是多對一的關係。你在哪裏定義多對多的領域並不重要。 –

0

也許在上次編輯器的文章模型中的另一個字段會爲您提供所需的信息。

lastEditor = models.ForeignKey(userModel.UserProfile)

如果你真的想保持你將需要實現另一種模式用於記錄像所有的編輯器:article_id的,主編和編輯時間(甚至如果你有興趣的變化文章文本)。然後,您可以根據當前文章查詢該medel以獲取所有編輯器的列表。

,你可以做同樣的:article_id的和創作者獲得文章的創造者的名單(這將取代文章場在您的用戶配置類)