2010-10-22 79 views
1

我可以在不同的應用程序中爲不同的模型提供相同的名稱嗎?什麼衝突可能發生?我可以在不同的應用程序中爲不同的模型提供相同的名稱嗎?

後,我有一個嘗試。我得到這個錯誤:

Error: One or more models did not validate: 
playlist.playlist: Accessor for field 'user' clashes with related field 'User.playlist_set'. Add a related_name argument to the definition for 'user'. 
audio_playlist.playlist: Accessor for field 'user' clashes with related field 'User.playlist_set'. Add a related_name argument to the definition for 'user'. 

回答

6

當然,你可以做那種事。不會有任何衝突,因爲表格內部存儲爲appname_modelname;假設您在名爲messages的應用程序中名爲的應用程序名爲blog,並且名爲Post的型號有。表格將存儲爲blog_postmessages_post。另外,python類名爲project.blog.models.Postproject.messages.models.Post,所以在這裏也沒有衝突。

編輯:此外,爲了能夠導入他們倆在一個文件中,使用這樣的:

import blog.models.Post as BlogPost 
import messages.models.Post as MessagesPost 

(或任何人的名字有意義)

+0

如果你在一個視圖中加載模型會發生什麼?或者,如果你做命令shell_plus例如? – Pol 2010-10-22 16:44:54

+0

確保名稱不會相互衝突。通過我的意思是像'import blog.models.Post as BlogPost'和'import message.models.Post as MessagesPost'這樣的東西' – 2010-10-22 16:46:04

+0

它怎麼樣加載模型,因爲它們是...它會給我一個錯誤嗎? – Pol 2010-10-22 16:48:45

-1

Django是建立在Python的。每個應用都有它自己的命名空間。

0

的確,在數據庫級別,這不會引起任何問題。

雖然你會遇到你的URL路徑和內部視圖名稱的問題!

假設你有兩個應用 - 「博客」和「評論」和每個人都有一個型號命名的消息,並且每個消息模式有一個相應的ModelViewSet(BlogMessageViewSet和CommentMessageViewSet,分別)

Django的路由器自動命名您的視圖名稱message-list,message-detail,等等......不考慮該模型在哪個應用程序中。因此,在將這些應用程序加載到路由器中之後,您將有碰撞,因爲您有兩個名爲「消息」的模型。例如,如果在urls.py我的路由器是這樣的:

router = routers.DefaultRouter() 
router.register(r'blog/message', BlogMessageViewSet) 
router.register(r'comment/message', CommentMessageViewSet) 

然後在內部都自認爲是最後登記用的/博客/郵件/評論/消息路由將指向/評論/消息路由器和內部視圖名稱將是message-listmessage-detail,等...

您可以通過給不同的基地名稱解決這個問題的你的意見,雖然一個像這樣的:

router = routers.DefaultRouter() 
router.register(r'blog/message', BlogMessageViewSet, view_name='blogmessage') 
router.register(r'comment/message', CommentMessageViewSet) 

雖然這種意志要求你e如果您使用的是HyperlinkedModelSerializer,並且在urlresolvers.reverse()或其他基於url的工具中使用視圖名稱'blockmessage'來引用此視圖的所有引用,則xplicit會在BlogMessageViewSet的序列化程序中將url定義爲HyperlinkedIdentityField。

相關問題