Я не уверен, как передать данные из двух «вложенных» моделей в конечную точку.
Я хочу настроить некоторые данные, относящиеся к пользователю, в моем приложении Django. После некоторого поиска в Google я нашел лучший способ «расширить» пользовательскую модель по умолчанию - создать другую модель с OneToOneField
, указывающим на пользователя. Вот как выглядит модель:
# models.py
from django.db import models
from django.contrib.auth.models import User
class UserData(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
currency = models.CharField(max_length=10, default="USD")
budget = models.IntegerField(default=500)
showCategories = models.BooleanField(default=True)
showLocations = models.BooleanField(default=True)
showSources = models.BooleanField(default=True)
def __str__(self):
return self.user
После написания модели я написал для нее новый сериализатор:
# serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'email', 'username')
class UserDataSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = UserData
fields = ('currency', 'budget', 'showCategories', 'showLocations', 'showSources', 'user')
Пока все хорошо (надеюсь).
Наконец, я изменил свой UserAPI, чтобы иметь serializer_class
из UserDataSerializer
. Вот как это выглядит сейчас:
# api.py
class UserAPI(generics.RetrieveAPIView):
permission_classes = [
permissions.IsAuthenticated,
]
serializer_class = UserDataSerializer
def get_object(self):
# I suppose I need to return something else here but I'm not sure what.
return self.request
При доступе к моей конечной точке я получаю следующие данные:
{
"user": {
"id": 1,
"email":"email@email.com",
"username":"myusername"
}
}
но я ожидал получить все в UserData следующим образом:
{
"user": {
"id": 1,
"email": "email@email.com",
"username": "myusername"
},
"currency": "USD",
"budget": 500,
"showCategories": true,
"showLocations": true,
"showSources": true
}
Изменить:
Вот так выглядит мой urls.py
:
from django.urls import path, include
from .api import RegisterAPI, LoginAPI, UserAPI
from knox import views as knox_views
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path('api/auth/', include('knox.urls')),
path('api/auth/user', UserAPI.as_view()),
path('api/auth/register', RegisterAPI.as_view()),
path('api/auth/login', LoginAPI.as_view()),
path('api/auth/logout', knox_views.LogoutView.as_view(), name='knox_logout'),
path('api/token/', TokenObtainPairView.as_view()),
path('api/token/refresh', TokenRefreshView.as_view())
]