我可以在不同的应用程序中为不同的模型命名吗?

时间:2010-10-22 16:38:21

标签: python django

我可以在不同的应用中为不同的型号指定相同的名称吗?什么可能发生冲突?

我试一试..我得到了这个错误:

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'.

4 个答案:

答案 0 :(得分:6)

当然你可以做到。不存在任何冲突,因为表格内部存储为appname_modelname;假设您在名为Post的应用中有一个名为blog的模型,在名为Post的应用中有一个名为messages的模型。表格将存储为blog_postmessages_post。此外,python类名为project.blog.models.Postproject.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-listmessage-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构建的。每个应用程序都有自己的命名空间。