首页 > 解决方案 > Django - 使用外键对象创建模型对象

问题描述

我觉得我不知道它应该如何工作......

我确实有 2 个模型:
Group 是我要保存的自定义模型。

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

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

User 是应用程序的标准用户模型。我现在跳过 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 时Group会创建一个新的。与Group有关系User,但其他字段(名称、主题)为空。

另一方面,在做请求序列化的时候,Useron对象是空的。

    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)

我如何连接这两个以使其工作?

标签: pythondjangoserialization

解决方案


这是有道理的,因为您从未使用序列化程序来反序列化请求,因此读取了 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', )

推荐阅读