扩展了 User 模型,但不太确定如何序列化 User 和 UserExtended 的字段

Extended the User model, but not quite sure how to serialize fields for both User and UserExtended

我用一个名为 UserExtended 的新模型扩展了我的 User 模型:

# 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.pyserializers.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. 为两个模型创建一个序列化程序 class 并从 views.py 中调用它们。我尝试在 serializer_class 中传递一个列表或元组(显然是单数是有原因的)。
  2. serializers.py 中设置关系。我正在调查这个。

关于如何解决这个问题的建议?

您需要不同的序列化程序和视图集才能在 UserExtended 上运行 我的建议是保持旧序列化程序不变并创建 UserExtendedSerializer

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

而视图集将是:

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

这应该可以解决您的问题