Я устанавливаю 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.
Прежде чем я начал взламывать наборы, я хотел посмотреть, сможет ли кто-нибудь предложить быстрое решение этой проблемы.