Расширил модель User, но не совсем уверен, как сериализовать поля как для User, так и для UserExtended

Я расширил свою модель User новой моделью, которая называется UserExtended:

# Django imports
from django.db import models
from django.contrib.auth.models import User

class UserExtended(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    crm_guid = models.UUIDField(unique=True)     
    security_q1 = models.CharField(max_length=255, blank=True, null=True)
    security_a1 = models.CharField(max_length=255, blank=True, null=True)
    security_q2 = models.CharField(max_length=255, blank=True, null=True)
    security_a2 = models.CharField(max_length=255, blank=True, null=True)
    attempts = models.SmallIntegerField(blank=False, null=False, default=0)
    key = models.CharField(max_length=255, blank=True, null=True)
    key_expires = models.DateTimeField(blank=True, null=True)
    method = models.CharField(max_length=4, blank=True, null=True)

    class Meta:
        db_table = 'auth_user_extended'

Я надеялся, что просто сделав это, некая магия Django позаботится об остальном, и мне не придется менять views.py или serializers.py. Но когда я посылаю запрос на конечную точку, я получаю:

[api] django.core.exceptions.ImproperlyConfigured: Field name `guid` is not valid for model `User`.

По-видимому, это действительно необходимо указать. Я просмотрел документацию и аналогичные вопросы SO, чтобы найти ответ.

Вот что у меня есть для views.py:

# Django imports
from django.contrib.auth.models import User

# Third party imports
from rest_framework import generics
from rest_framework.permissions import IsAdminUser

# App imports
from users.serializers import UserSerializer


class UsersListCreateView(generics.ListCreateAPIView):
    permission_classes = [IsAdminUser]
    serializer_class = UserSerializer

    def get_queryset(self):
        queryset = User.objects.all()
        email = self.request.query_params.get('email')
        username = self.request.query_params.get('username')
        if email:
            queryset = queryset.filter(email=email)
        if username:
            queryset = queryset.filter(username=username)
        return queryset


class UserRetrieveUpdateDeleteView(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = [IsAdminUser]
    queryset = User.objects.all()
    serializer_class = UserSerializer

Для моего serializers.py у меня просто есть:

# Django imports
from django.contrib.auth.models import User
from users.models import UserExtended
from django.contrib.auth.hashers import make_password

# Third party imports
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'last_login', 'first_name',
                  'last_name', 'username', 'email', 'is_active', 'guid']

Если я изменю model = User на model = UserExtemded, то получу ошибку типа:

[api] django.core.exceptions.ImproperlyConfigured: Field name `last_login` is not valid for model `UserExtended`.

Я думаю, что мне нужно сделать одну из двух вещей:

  1. Create a serializer class for both models and call them both from the views.py. I've toyed with this a little by trying to pass a list or tuple in of serializer_class (apparently singular for a reason).
  2. Setup the relationship in the serializers.py. I'm looking into this now.

Предложения о том, как решить эту проблему?

Вам нужен другой сериализатор и набор представлений для работы с UserExtended. Мое предложение - оставить старый сериализатор как есть и создать UserExtendedSerializer

class UserExtendedSerializer(serializers.ModelSerializer):
    user = UserSerializer(many=False, read_only=True)
    class Meta:
        model = UserExtended
        fields = "__all__"

а viewset будет просто:

class UserExtendedViewSet(ModelViewSet):
    serializer_class = UserExtendedSerializer
    queryset = UserExtended.objects.all()

это должно решить вашу проблему

Вернуться на верх