django-rest-framework - 在发布请求时更新外键相关实例
问题描述
我正在尝试实现一个用户可以订阅公司的系统。为此,我必须实现以下流程:
- 用户注册
- 用户点击按钮订阅公司
- 用户必须输入一个代码(每个公司都有一个密码。通过拥有用户证明他与该公司有某种关系)
- 用户已订阅
为此,我必须实现一个 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)
显然,我必须:
- 通过 POST 方法从用户那里接收代码
- 搜索数据库并找出代码是否对应于任何公司
- 编辑用户的 ForeignKey 字段并将其链接到公司
但是我将在哪里实现这个逻辑。以我有限的经验,我看到了三种可能性:
- 调用
serializer.save()
并编写自定义create()
方法(但我不想创建任何东西,所以这似乎是不好的做法 - 在视图中实现此逻辑,但我想从中访问代码
validated_data
(这似乎是个问题?) - 我可以
save()
为序列化程序编写自定义方法吗?是否有自定义save()
方法的示例,因为原始的 drfsave()
方法包含很多验证逻辑。
显然我不希望你们为我编写整个代码,但也许有人对如何以及在哪里实现这个有一定的蓝图?
解决方案
执行此操作的步骤:
- 在Customer表中创建一个字段company_code并将该字段设置为Foreign key。
- 使用该外键字段创建序列化程序。
- 创建一个视图集或通用视图,以期望 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"
}
推荐阅读
- javascript - Vim Prettier 插件导致以 .js 扩展名结尾的文件出现错误
- javascript - 将带值的参数传递给函数不能按预期工作
- android - ViewModel 更新屏幕旋转
- python - 数据流作业停止随机处理数据
- python - 根据其他单元格的内容将数据添加到列(Python/Excel)
- angular - 函数记忆应该总是首选吗?
- c - 编译 C 文件时出错。致命错误:找不到“conio.h”文件
- django - 为什么我的表单中的输入没有写入 django 中的 sqlite3 数据库
- javascript - 尝试访问电影文件中的数据并在主文件中使用它
- javascript - 如何在数据表中按范围过滤日期?