Модели маршрутизации DRF с одним и тем же именем в нескольких приложениях - PullRequest
0 голосов
/ 13 января 2019

Я устанавливаю DRF API, в котором есть несколько приложений с одинаковыми названиями моделей. Как мне настроить роутер, чтобы найти правильную модель?

В проекте есть два приложения, «GreenApp» и «BlueApp», оба из которых имеют модель клиента, которая имеет отношение OneToOne с пользователем.

Зеленое приложение

green_app.models.profiles.py

from users.models import User

class Client(models.Model):
    user = models.OneToOneField(User, related_name="green_client")
    ...

green_app.serializers.profiles.py

from rest_framework import serializers
from green_app.models.profiles import Client

class GreenClientSerializer(serializers.HyperlinkedModelSerializer)
    class Meta:
        model = Client
        fields = ('url, 'user', ...)

green_app.viewsets.profiles.py

from rest_framework import viewsets
from green_app.models.profiles import Client

class GreenClientViewset(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = GreenClientSerializer

Blue App

blue_app.models.profiles.py

from users.models import User

class Client(models.Model):
    user = models.OneToOneField(User, related_name="blue_client")
    ...

blue_app.serializers.profiles.py

from rest_framework import serializers
from green_app.models.profiles import Client

class BlueClientSerializer(serializers.HyperlinkedModelSerializer)
    class Meta:
        model = Client
        fields = ('url, 'user', ...)

blue_app.viewsets.profiles.py

from rest_framework import viewsets
from blue_app.models.profiles import Client

class BlueClientViewset(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = BlueClientSerializer

users.serializers.py

from rest_framework import serializers
from green_app.serializers.profiles import GreenClientSerializer
from blue_app.serializers.profiles import BlueClientSerializer
from users.models import User

class UserSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
        model = User
        fields = ('url', 'green_client', 'blue_client')

users.viewsets.py

from rest_framework import viewsets, permissions
from users.models import User

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

urls.py

from django.urls import path, include
from rest_framework import routers
from users.viewsets import UserViewSet
from green_app.viewsets.profiles import GreenClientViewSet
from blue_app.viewsets.profiles import BlueClientViewSet

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'green/client', GreenClientViewSet)
router.register(r'blue/client', BlueClientViewSet)

url_patterns = [path('api/v0/', include(router.urls)),]

GET Запрос пользователя

Ожидаемое

{
    "url": "http://localhost:8000/auth/users/2/",
    "green_client": "http://localhost:8000/api/v0/green/client/1/",
    "blue_client": "http://localhost:8000/api/v0/blue/client/1/"
}

1041 * Полученное * { "url": "http://localhost:8000/auth/users/2/", "green_client": "http://localhost:8000/api/v0/blue/client/1/", "blue_client": "http://localhost:8000/api/v0/blue/client/1/" } Обратите внимание, что для обоих маршрутов используется Синяя маршрутизация В поисках помощи я нашел эту статью , поэтому я попытался добавить base_name к своим маршрутизаторам следующим образом: router.register(r'green/client', GreenClientViewSet, 'blue-client') router.register(r'blue/client', BlueClientViewSet, 'green-client') Это привело к новой ошибке: ImproperlyConfigured at /auth/users/2/ Could not resolve URL for hyperlinked relationship using view name "client-detail". You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field. Прежде чем я начал взламывать наборы, я хотел посмотреть, сможет ли кто-нибудь предложить быстрое решение этой проблемы.

...