根据发布请求更新与外键相关的实例

时间:2019-02-19 09:38:02

标签: django-rest-framework

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

  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()方法包含很多验证逻辑,因为自定义save()方法有什么示例。

很显然,我不希望你们为我编写整个代码,但是也许有人对如何以及在何处实现此代码有一定的了解?

1 个答案:

答案 0 :(得分:0)

执行此操作的步骤:

  1. 客户表中创建一个字段公司代码,并将其 字段为外键
  2. 使用该外键字段创建一个序列化器。
  3. 创建一个视图集或通用视图,以期望Post方法中的该字段作为公司的 Id 。使用save()方法存储外键。

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

请参阅代码示例,

Models.py

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

Serializer.py

class CustomerSerializer(serializers.ModelSerializer):

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

Views.py

class CustomerViewSet(viewsets.ModelViewSet):

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

请求数据(POST Json)

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