程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

如何将发出请求的用户分配给 Django 模型中的外键字段

发布于2023-11-18 10:24     阅读(10366)     评论(0)     点赞(15)     收藏(0)


我目前正在开发一个类似于discord 的网络应用程序。我试图将发送创建服务器请求的用户设置为服务器的所有者,以便他唯一想要输入的内容是诸如名称、图标和描述之类的详细信息。这是我的服务器模型:

class Server(models.Model):
    name = models.CharField(max_length=30)
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="server_owner")
    creation_date = models.DateTimeField(auto_now_add=True)
    description = models.CharField(max_length=250, null=True, blank=True)
    member = models.ManyToManyField(
        settings.AUTH_USER_MODEL, related_name="servers", through='ServerMember')
    icon = models.FileField(
        upload_to=server_icon_upload_path, null=True, blank=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        is_new_server = self._state.adding
        if is_new_server:
            super().save(*args, **kwargs)

            try:
                member_role = Role.objects.create(
                    name="member",
                    server=self
                )
                server_member = ServerMember.objects.create(
                    user=self.owner, server=self)
                server_member.role.add(member_role)
            except Exception as e:
                print(f"Error creating 'member' role: {e}")

        if self.id:
            existing = get_object_or_404(Server, id=self.id)
            if existing.icon and existing.icon != self.icon:
                # Delete the old icon
                existing.icon.delete(save=False)

        super().save(*args, **kwargs)

序列化器:

class ServerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Server
        fields = '__all__'

我尝试重写perform_create函数,但它不起作用:

class ServerCreateView(generics.CreateAPIView):
    queryset = Server.objects.all()
    serializer_class = ServerSerializer
    permission_classes = [IsAuthenticated] 

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

这是我在测试 api 时遇到的错误:响应

{
    "owner": [
        "This field is required."
    ]
}

解决方案


perform_create永远不会被调用,因为在此之前验证失败。

从验证中删除该owner字段(例如,通过从序列化程序中排除该字段),或者在序列化程序的初始数据中为该字段提供一个值,以便验证成功。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/2039598/2db4c9d60f0c3c9805bf/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

15 0
收藏该文
已收藏

评论内容:(最多支持255个字符)