简体   繁体   English

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

[英]Django - Create model object with Foreign Key object

I don't feel like I get an idea on how it should work...我觉得我不知道它应该如何工作......

I do have 2 models:我有 2 个模型:
Group is my custom model I wanna save.组是我想保存的自定义模型。

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 is a standard user model for the application. User 是应用程序的标准用户模型。 I'm skipping UserManager for now.我现在跳过 UserManager。 Simply said User can have multiple groups.简单地说,用户可以有多个组。

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()

A serializer for the custom model:自定义模型的序列化程序:

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

And a viewset with overwritten create method:以及一个带有覆盖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)

When calling a POST a new Group is created.调用 POST 时会创建一个新Group The Group has relation to the User , but other fields (name, subject) are empty. GroupUser有关系,但其他字段(名称、主题)为空。

On the other hand, when doing the request serialization, the User on the object is empty.另一方面,在进行请求序列化时,对象上的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)

How do I connect those 2 to make it work?我如何连接这两个以使其工作?

That makes sense since you never used the serializer to deserialize the request, and thus read the details passed in the POST request.这是有道理的,因为您从未使用序列化程序来序列化请求,因此读取了 POST 请求中传递的详细信息。 You can work with:您可以与:

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

In the serializer you mark the user field as read_only , to prevent the serializer from failing in case the user was not part of the request:在序列化程序中,您将user字段标记为read_only ,以防止序列化程序在user不属于请求的情况下失败:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM