我可以在不同的应用中为不同的型号指定相同的名称吗?什么可能发生冲突?
我试一试..我得到了这个错误:
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'.
答案 0 :(得分:6)
当然你可以做到。不存在任何冲突,因为表格内部存储为appname_modelname
;假设您在名为Post
的应用中有一个名为blog
的模型,在名为Post
的应用中有一个名为messages
的模型。表格将存储为blog_post
和messages_post
。此外,python类名为project.blog.models.Post
和project.messages.models.Post
,因此这里也没有冲突。
编辑:另外,为了能够在一个文件中导入它们,请使用以下内容:
import blog.models.Post as BlogPost
import messages.models.Post as MessagesPost
(或任何有意义的名字)
答案 1 :(得分:0)
确实,在数据库级别,这不会导致任何问题。
但是,您的URL路由和内部视图名称会遇到问题!
假设您有两个应用程序 - “blog”和“comments”,每个应用程序都有一个名为Message的模型,每个Message模型都有一个相应的ModelViewSet(分别是BlogMessageViewSet和CommentMessageViewSet)
Django路由器会自动命名您的视图名称message-list
,message-detail
等...而不考虑该模型所在的应用。因此,将这些应用加载到您的应用中后会发生冲突路由器,因为你有两个名为'Message'的模型。例如,如果在urls.py中,我的路由器看起来像这样:
router = routers.DefaultRouter()
router.register(r'blog/message', BlogMessageViewSet)
router.register(r'comment/message', CommentMessageViewSet)
然后,内部/ blog / message和/ comment / message的路由将指向/ comment / message,因为它最后一次在路由器中注册,内部视图名称为message-list
,{{1}等等...
您可以通过为其中一个视图提供不同的基本名称来解决此问题,如下所示:
message-detail
如果您使用的是HyperlinkedModelSerializer,并且要在urlresolvers.reverse()或其他基于url的工具中对此视图进行所有引用,则需要您在BlogMessageViewSet的序列化程序中明确定义url作为HyperlinkedIdentityField,并使用该视图名字'blockmessage'。
答案 2 :(得分:0)
是的,我在我的一个项目中做了同样的事情。 如果模型有 ForeignKey 字段,例如 BolgPost.author ,那么您必须为它们提供 related_name。
author = models.ForeignKey(User,related_name='eu_author', on_delete=models.CASCADE)
答案 3 :(得分:-2)
Django是基于Python构建的。每个应用程序都有自己的命名空间。