Расширил модель 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`.
Я думаю, что мне нужно сделать одну из двух вещей:
- 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 ofserializer_class
(apparently singular for a reason). - 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()
это должно решить вашу проблему