首页 > 解决方案 > 在发布请求时更新外键相关实例

问题描述

我正在尝试实现一个用户可以订阅公司的系统。为此,我必须实现以下流程:

  1. 用户注册
  2. 用户点击按钮订阅公司
  3. 用户必须输入一个代码(每个公司都有一个密码。通过拥有用户证明他与该公司有某种关系)
  4. 用户已订阅

为此,我必须实现一个 API 端点来接收用户的代码(此时用户已通过身份验证)。

这很可耻,但我迷失了:我正在考虑实施这样的观点。

class RegisterUserToCustomer(APIView):

    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, format=None):

        serializer = CustomerSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user=self.request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)

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

显然,我必须:

  1. 通过 POST 方法从用户那里接收代码
  2. 搜索数据库并找出代码是否对应于任何公司
  3. 编辑用户的 ForeignKey 字段并将其链接到公司

但是我将在哪里实现这个逻辑。以我有限的经验,我看到了三种可能性:

  1. 调用serializer.save()并编写自定义create()方法(但我不想创建任何东西,所以这似乎是不好的做法
  2. 在视图中实现此逻辑,但我想从中访问代码validated_data(这似乎是个问题?)
  3. 我可以save()为序列化程序编写自定义方法吗?是否有自定义save()方法的示例,因为原始的 drfsave()方法包含很多验证逻辑。

显然我不希望你们为我编写整个代码,但也许有人对如何以及在哪里实现这个有一定的蓝图?

标签: django-rest-framework

解决方案


执行此操作的步骤:

  1. Customer表中创建一个字段company_code并将该字段设置为Foreign key
  2. 使用该外键字段创建序列化程序。
  3. 创建一个视图集或通用视图,以期望 Post 方法中的该字段作为公司的Id。使用save()方法存储外键。

此方案仅适用于订阅一个组织,如果您能够订阅多个组织,则将该字段设置为多对多字段。

参考代码示例,

模型.py

class Customer(models.Model):
    # customer related field
    name = models.CharField(max_length=20)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE)

序列化器.py

class CustomerSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('name', 'organization', )

视图.py

class CustomerViewSet(viewsets.ModelViewSet):

    serializer_class = CustomerSerializer
    queryset = Customer.objects.all()

请求数据(POST Json)

{
     "name": "test", 
     "organization": "id-of company"
}

推荐阅读