Могу ли я дать одно и то же имя для разных моделей в разных приложениях? - PullRequest
2 голосов
/ 22 октября 2010

Могу ли я дать одно и то же имя для разных моделей в разных приложениях? и какие конфликты могут случиться?

После того, как я попробую .. Я получил эту ошибку:

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

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

Конечно, вы можете сделать это.Конфликтов не будет, потому что таблицы хранятся внутри как appname_modelname;скажем, у вас есть модель с именем Post в приложении с именем blog и модель с именем Post в приложении с именем messages.Таблицы будут храниться как blog_post и messages_post.Кроме того, классы python имеют имена project.blog.models.Post и project.messages.models.Post, поэтому здесь тоже нет конфликтов.

EDIT : Кроме того, чтобы иметь возможность импортировать их оба в один файл, используйте что-нибудькак это:

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

(или любые имена, которые имеют смысл)

0 голосов
/ 22 сентября 2017

Это правда, что на уровне базы данных это не вызовет никаких проблем.

Однако у вас возникнут проблемы с маршрутами URL и именами внутренних представлений!

Предположим, у вас есть два приложения - "блог" и "комментарии", и у каждого есть модель с именем Message, и каждая модель сообщения имеет соответствующий 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)

Тогда внутренне оба маршрута для / blog / message и / comment / message будут указывать на / comment / message, поскольку он был зарегистрирован последним на маршрутизаторе, а внутренне имена представлений будут message-list, message-detail и т. Д. ..

Вы можете решить эту проблему, назначив другое базовое имя одному из ваших представлений, хотя бы так:

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

Хотя это потребует от вас явного определения URL как HyperlinkedIdentityField на сериализаторе для BlogMessageViewSet, если вы используете HyperlinkedModelSerializer, и чтобы все ссылки на это представление в urlresolvers.reverse () или других инструментах на основе URL использовали представление название 'blockmessage.'

0 голосов
/ 22 октября 2010

Django построен на Python.Каждое приложение имеет свое собственное пространство имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...