扩展了 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.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`.
我想我需要做以下两件事之一:
- 为两个模型创建一个序列化程序 class 并从
views.py
中调用它们。我尝试在 serializer_class
中传递一个列表或元组(显然是单数是有原因的)。
- 在
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()
这应该可以解决您的问题
我用一个名为 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.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`.
我想我需要做以下两件事之一:
- 为两个模型创建一个序列化程序 class 并从
views.py
中调用它们。我尝试在serializer_class
中传递一个列表或元组(显然是单数是有原因的)。 - 在
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()
这应该可以解决您的问题