2015-03-14 6 views
0

У меня есть проект с двумя приложениями:Одинаковые названия модели в проекте Джанго

  • счетов,
  • классы.

В приложении учетных записей Я использую модель группы Django (для разрешений учетной записи) и в приложении классов. У меня есть еще одна модель с именем Group (но она должна интерпретироваться как группа студентов).

Мой url.py выглядит следующим образом:

(...) 
from rest_framework import routers 
from .accounts import views as accounts_views 
from .classes import views as classes_views 

router = routers.DefaultRouter() 
(...) 
router.register(r"groups", accounts_views.GroupViewSet) 
router.register(r"classes/groups", classes_views.GroupViewSet) 
(...) 

Но он не работает, как ожидалось./api выглядит следующим образом:

HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    (...) 
    "groups": "http://127.0.0.1:8000/api/classes/groups/", 
    "classes/groups": "http://127.0.0.1:8000/api/classes/groups/", 
    (...) 
} 

Итак, обе цели совпадают с тем, что я не хочу. Страница администратора работает хорошо (я могу редактировать группу групп и классов группы).

Любые предложения?

Edit:

Изменение одной линии url.py как ниже (как это было предложено в одном из ответов ниже):

router.register(r"classes_groups", classes_views.GroupViewSet) 

изменений/апи страница на:

HTTP 200 OK 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 

{ 
    (...) 
    "groups": "http://127.0.0.1:8000/api/classes_groups/", 
    "classes/groups": "http://127.0.0.1:8000/api/classes_groups/", 
    (...) 
} 

Так Решение @argaen обычно не является решением для этого случая.

+0

Я думаю, что, называя модели с тем же именем не лучшая идея в любом случае. Для меня трудно предсказать, какие еще могут быть проблемы, но семантически это неправильный способ назвать объекты. –

+0

Я согласен с тобой. Всякий раз, когда можно избежать конфликтов имен, я делаю это (то есть используя синонимы). Но в этом случае использование другого имени для Classes Group Group Group совершенно неинтуитивно. – tommus

+0

Возможно, StudentGroup? –

ответ

1

URL-адрес в имя по умолчанию на имя нижнего регистра модели, которая в данном случае является 'group' для обоих viewsets. Таким образом, reverse не может отличить и возвращает первое совпадение для обоих.

Я считаю, передавая явное базовое имя, по крайней мере, один из URLs должен исправить:

router = routers.DefaultRouter() 
(...) 
router.register(r"groups", accounts_views.GroupViewSet) 
router.register(r"classes/groups", classes_views.GroupViewSet, "classes_group") 
(...) 
+0

Работает как шарм. Благодаря! – tommus

0

Вы не можете добавлять пути со слэшем в маршрутизаторы rest_framework. Формат: this. Также проверьте this question.

Вы можете использовать решение, данное в связанном вопросе или задать URL-адрес так:

router.register(r"classes_groups", classes_views.GroupViewSet) 
+0

Скорее спрашиваю «почти» то же самое. Конечно, можно использовать косые черты - я даже делаю это в одном проекте (но без имени clushes) и отлично работает. – tommus

+0

И вы получили его, вызвав «маршрутизатор».зарегистрировать' с косой чертой в URL-адресе? – argaen

+0

Если вы имеете в виду решение, о котором я спросил выше - нет, у меня пока нет работы. Если вы имеете в виду вообще (без столкновений имен) - да, используя слэши в URL-адресах, переданные в DefaultRouter, он отлично работает. – tommus

 Смежные вопросы

  • Нет связанных вопросов^_^