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 框架中的序列化程序发送自定义错误响应?