我可以在不同的应用程序中为不同的模型提供相同的名称吗?

问题描述:

我可以在不同的应用程序中为不同的模型提供相同的名称吗?什么冲突可能发生?我可以在不同的应用程序中为不同的模型提供相同的名称吗?

后,我有一个尝试。我得到这个错误:

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

当然,你可以做那种事。不会有任何冲突,因为表格内部存储为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

Django是建立在Python的。每个应用都有它自己的命名空间。

的确,在数据库级别,这不会引起任何问题。

虽然你会遇到你的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。