2013-11-22 81 views
1

(警告:我是相當新的Django和MVC模型)屬性在模型 - 視圖設計

假設我在模型下面的類:

class Member(models.Model): 
    user = models.OneToOneField(User) 

class Project(models.Model): 
    name = models.CharField(max_length=200) 

class ProjectMember(models.Model): 
    unique_together = ('project', 'member') 
    project = models.ForeignKey(Project) 
    member = models.ForeignKey(Member) 

現在,我想獲取成員的所有項目列表。所以我補充說:

@property 
def projects(self): 
    return Project.objects.filter(projectmember__member=self) 

但我也可以在視圖中添加此過濾器或建立額外的功能來做到這一點。有沒有任何指導?模型應該包含任何屬性?它使代碼可重用,但我可以通過額外的功能實現,這不會混淆模型。

回答

1

模型確實可以具有屬性和其他方法。這實際上很常見,因爲模型上的很多操作都可能進入方法。如果屬性或方法合適,則不需要將其移至單獨的函數。

單獨的函數在處理多個模型或執行某些與特定模型無關的事情時非常有用。

1

在Django中,遵循「胖模型,薄視圖」結構通常被認爲是很好的做法。這意味着你對你的觀點投入的邏輯越少越好。很顯然,某些視圖邏輯是不可避免的,但總的來說,像你正在嘗試做的那樣的許多任務更適合於模型。

1
Project.objects.filter(projectmember__member=self) 

這是一個非常簡單的查詢,並確保該視圖更好的地方沒有任何方法或屬性。另外,您不必記住型號Project中的什麼意思projects

如果有一些更多的邏輯,以將其添加我會移動代碼在單獨的方法,緩存或東西,如果該方法可以從許多地方被稱爲應用程序的(而不是一個具體的視圖)。

1

這是更好地使用反向關係:

member.project_set.all()

其中由Django的自動生成,更多的信息:https://docs.djangoproject.com/en/dev/topics/db/queries/#m2m-reverse-relationships

+0

我認爲你可以使用M2M,通過關係: https://開頭的文檔。 djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships 然後查找將非常簡單。 – Nikita

+0

我知道ManyToManyField選項,但我的項目中還有其他字段,爲了使問題更容易閱讀,我刪除了這些字段。所以基本上我需要交叉引用表 - ProjectMember來容納其他位。 – Juliusz