Django, Есть ли способ получить доступ к дополнительным пользовательским полям к стандартной модели пользователя в сериализаторе?
Я пытаюсь отправить текущую информацию о пользователе через конечную точку API. Я использую стандартную модель пользователя Django и добавляю дополнительные поля через inline. (Пожалуйста, смотрите код ниже) Мне интересно, есть ли способ, которым я могу получить доступ к новым добавленным полям в сериализаторе User? Я перепробовал много способов включить новые добавленные данные, но все безуспешны.
(например, я пытаюсь передать gender_identity в мой сериализатор, чтобы мой фронтенд мог получить доступ к информации)
Вот мой serializer.py:
from django.contrib.auth.models import User
from accounts.models import Account
class UserSerializer(serializers.ModelSerializer):
# author = serializers.SlugRelatedField(queryset=User.objects.all(), slug_field='username')
class Meta:
# gender_identity = User.objects.get(username = 'bucky').account.gender_identity
model = User
fields = ['username', 'email','first_name','last_name']
read_only_fields = ['username', 'email','first_name','last_name']
depth = 3
Вот мой Views.py:
from rest_framework import viewsets
# from .serializers import UserSerializer
from .serializers import UserSerializer
from django.contrib.auth.models import User
from rest_framework.generics import (ListAPIView,
ListCreateAPIView,
DestroyAPIView,
UpdateAPIView)
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
def get_object(self):
# print(self.request.user.account.gender_identity)
print(type(self.request.user))
return self.request.user
def list(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
Мой models.py:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Account(models.Model):
# user = models.ForeignKey(User, on_delete=models.CASCADE)
user = models.OneToOneField(User, on_delete=models.CASCADE)
gender_identity = models.TextField()
sexual_orientation = models.TextField()
# note = models.TextField()
# def __str__(self):
# return self.user.username
admin.py
from django.contrib import admin
# Register your models here.
from accounts.models import Account
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
class AccountInline(admin.StackedInline):
model = Account
can_delete = False
verbose_name_plural = 'Accounts'
class CustomizedUserAdmin (UserAdmin):
inlines = (AccountInline,)
admin.site.unregister(User)
admin.site.register(User, CustomizedUserAdmin)
и url.py
from django.urls import path, include
from . import views
from accounts.api.views import UserViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('', views.UserViewSet, basename='users')
# urlpatterns = router.urls
urlpatterns = [
path('accounts/', include(router.urls)),
Пожалуйста, сообщите мне ваши мысли по этому поводу. Любые соображения могут помочь. Спасибо
Мы можем сделать это двумя способами:
1. Представьте его с помощью других сериализаторов:
class AccountSerializer(ModelSerializer):
class Meta:
model = Account
fields = ("gender_identity", "sexual_orientation")
class UserSerializer(ModelSerializer):
account = AccountSerializer(read_only=True)
class Meta:
model = User
fields = (
"username", "email", "first_name", "last_name",
"account", # <--new
)
# ====== maybe want to like below ===============
class UserSerializer(ModelSerializer):
detail = AccountSerializer(source="account", read_only=True)
class Meta:
model = User
fields = (
"username", "email", "first_name", "last_name",
"detail", # <--new
)
2. Представьте его как пользовательское поле.
class UserSerializer(ModelSerializer):
gender_identity = serializers.CharField(
source="account.gender_identity", read_only=True)
sexual_orientation = serializers.CharField(
source="account.sexual_orientation", read_only=True)
class Meta:
model = User
fields = (
"username", "email", "first_name", "last_name",
"gender_identity",
"sexual_orientation",
)