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",
        )
Вернуться на верх