DRF 序列化程序中自动生成的模型字段

Auto generated model field in DRF serializer

我有一个模型 Classroom,它有一个自动生成的字段 code

from django.utils.crypto import get_random_string

class Classroom(models.Model):
    CODE_LEN = 16
    teacher = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    name = models.CharField(max_length=250)
    subject = models.CharField(max_length=50)
    code = models.CharField(max_length=CODE_LEN, unique=True)

    def save(self, *args, **kwargs):
        while True:
            self.code = get_random_string(length=16)
            if not Classroom.objects.filter(code=self.code).exists():
                break

        super().save(*args, **kwargs)

Classroom 的序列化程序是 -

class ClassroomSerializer(serializers.ModelSerializer):
    class Meta:
        model = Classroom
        fields = ('teacher', 'name', 'subject', 'code')

这是新建视图Classroom -

class ListCreateClassroom(APIView):
    def get(self, request):
        classrooms = Classroom.objects.all()
        serializer = ClassroomSerializer(classrooms, many=True)
        return Response(serializer.data)

    def post(self, request):
        token = request.headers.get('Authorization').split()[1]
        token_obj = AccessToken.objects.get(token=token)
        teacher = token_obj.user.pk
        request.data.update({"teacher": teacher})

        serializer = ClassroomSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

当我发送 api 添加新教室的请求时,该请求不包含 code 字段,因此 serializer.is_valid() 抛出错误。

解决它的一种方法是在视图中创建一个 code 并将其添加到 request
但是,有没有更好的方法呢?

只需将序列化程序中的code字段设置为read_only=True:

class ClassroomSerializer(serializers.ModelSerializer):
  
  code = serializers.CharField(read_only=True)      

  class Meta:
    model = Classroom
    fields = ('teacher', 'name', 'subject', 'code')