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

How to assign the user making the request to a foreign key field in Django models

提问人:Tom Xavier 提问时间:11/14/2023 最后编辑:Tom Xavier 更新时间:11/15/2023 访问量:62

问:

我目前正在开发一个类似于 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."
    ]
}
python django django 模型 django 视图

评论

1赞 Temi 11/14/2023
嘿,你能分享一下你遇到的错误以及你的ServerSerializer吗
1赞 willeM_ Van Onsem 11/14/2023
那么究竟什么不起作用呢?这到底是怎么回事?
0赞 Tom Xavier 11/14/2023
{ “owner”: [ “此字段为必填项。”,这是我面临的问题
0赞 Temi 11/15/2023
您能否确认您发送的发布请求包含正确的数据?您的帖子请求应该有一个类似于 {“owner”: “owner_id”} 的正文
0赞 Tom Xavier 11/15/2023
@Temi,我明白.但是我想做的是,我想在不接受所有者的情况下创建服务器:“”输入并将发送请求的人设置为所有者

答:

0赞 CoffeeBasedLifeform 11/15/2023 #1

perform_create从不调用,因为在此之前验证失败。

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