Django-使用外键对象创建模型对象

时间:2020-10-21 21:17:52

标签: python django serialization

我不知道该如何工作...

我有2种型号:
组是我要保存的自定义模型。

class Group(models.Model):
    name = models.CharField(max_length=40)
    subject = models.CharField(max_length=40)

    user = models.ForeignKey('User', on_delete=models.CASCADE)

用户是应用程序的标准用户模型。我现在正在跳过UserManager。简单地说,用户可以有多个组。

class User(AbstractBaseUser, PermissionsMixin):
    name = models.CharField(max_length=40, null=True, blank=True)
    surname = models.CharField(max_length=40, null=True, blank=True)
    objects = UserManager()

自定义模型的序列化器:

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('id', 'name', 'subject', 'user')

还有一个覆盖了create方法的视图集:

class GroupViewSet(viewsets.ModelViewSet):
    serializer_class = GroupSerializer

    def create(self, request, *args, **kwargs):
        group = group.objects.create(user=self.request.user)
        serializer = GroupSerializer(group)

        return Response(serializer.data)

调用POST时,会创建一个新的GroupGroupUser有关系,但其他字段(名称,主题)为空。

另一方面,在进行请求序列化时,对象上的User为空。

    def create(self, request, *args, **kwargs):
        serializer = GroupSerializer(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)

如何连接这2个使其工作?

1 个答案:

答案 0 :(得分:0)

这很有意义,因为您从未使用序列化器对请求进行反序列化,因此无法读取POST请求中传递的详细信息。您可以使用:

def create(self, request, *args, **kwargs):
    serializer = GroupSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(user=self.request.user)
    else:
        # return response when the serializer rejects the input
        pass
    # return a response
    pass

在序列化程序中,您将user字段标记为read_only,以防止序列化程序在user不属于请求的情况下失败:

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('id', 'name', 'subject', 'user')
        read_only_fields = ('user', )