django rest 框架序列化程序中的关系数据库

Posted

技术标签:

【中文标题】django rest 框架序列化程序中的关系数据库【英文标题】:Relational database in django rest framework serializers 【发布时间】:2021-01-11 23:59:51 【问题描述】:

我正在为网络博客开发一个 Rest API,我已经创建了自定义用户类并在自定义用户类和帖子类之间建立了关联,但是当我尝试发出帖子请求并将帖子添加到数据库时由于用户和帖子模型之间的关系,我被困在序列化帖子中,我想做的只是让帖子的作者是当前登录的用户,但我实际上不知道该怎么做这个

自定义用户模型:

class CustomUser(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(max_length=255, unique=True, blank=False, null=False)
    username = models.CharField(max_length=255, unique=True, blank=False, null=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_superuser = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = CustomUserManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_superuser

后模型:

class Post(models.Model):
    title = models.CharField(max_length=255, blank=False, null=False)
    content = models.CharField(max_length=10000, blank=False, null=False)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

后序列化器:

class PostSerializer(ModelSerializer):


    class Meta:
        model = Post
        # I don't know if this way is right
        fields = ('id', 'title', 'content', 'author')
        extra_kwargs = "author": "read_only": True

    def create(self, validated_data, request):
        post = Post(
            title=validated_data['title'],
            content=validated_data['content'],
            # I don't know what's gonna be assigned to the author
            author=
        )
        post.save()
        return post

帖子视图:

class AddPostView(APIView):

    serializer_class = serializers.PostSerializer

    def post(self, request):
        serializer = serializers.PostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(data=serializer.data)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

【问题讨论】:

更新你的Post Serializer的create方法,可以得到当前用户 --> ***.com/a/34975314/8150371 请出示您的视图文件以便我们提供帮助 @GProst 我已经编辑了帖子并添加了帖子视图 【参考方案1】:

起初,在我看来,您不需要在 PostSerializer 中指定您的自定义 create 方法。并且author字段不能为read_only,否则会被忽略,不会被保存。所以它可能看起来像这样:

class PostSerializer(ModelSerializer):
  class Meta:
    model = Post
    fields = ('id', 'title', 'content', 'author')

那么这就是您在视图操作中分配作者的方式:

def post(self, request):
  current_user = request.user
  serializer = serializers.PostSerializer(data=**request.data, author=current_user)
  ...

【讨论】:

【参考方案2】:

我找到了一种适合我的方法。 将上下文从视图传递给序列化程序 帖子查看:

class AddPostView(APIView):

serializer_class = serializers.PostSerializer

def post(self, request):
    serializer = serializers.PostSerializer(data=request.data, context='request': request)
    if serializer.is_valid():
        serializer.save()
        return Response(data=serializer.data)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

然后这里是序列化器。 后序列化器

class PostSerializer(ModelSerializer):

    class Meta:
        model = Post
        fields = ('id', 'title', 'content', 'author')
        extra_kwargs = "author": "read_only": True

    def create(self, validated_data):
        user = self.context['request'].user
        post = Post(
            title=validated_data['title'],
            content=validated_data['content'],
            author=user
        )
        post.save()
        return post

【讨论】:

以上是关于django rest 框架序列化程序中的关系数据库的主要内容,如果未能解决你的问题,请参考以下文章

嵌套关系序列化程序中的 Django Rest Framework 模型 Id 字段

嵌套序列化程序 django rest 框架中的上下文

从 django rest 框架中的序列化程序发送自定义错误响应?

Django rest框架反向关系序列化器排除字段

序列化程序中的django rest框架更新方法,实例不会立即保存

python django-rest-framework 3.3.3 更新嵌套序列化程序