python - Django - 使用外键对象创建模型对象
问题描述
我觉得我不知道它应该如何工作......
我确实有 2 个模型:
Group 是我要保存的自定义模型。
class Group(models.Model):
name = models.CharField(max_length=40)
subject = models.CharField(max_length=40)
user = models.ForeignKey('User', on_delete=models.CASCADE)
User 是应用程序的标准用户模型。我现在跳过 UserManager。简单地说,用户可以有多个组。
class User(AbstractBaseUser, PermissionsMixin):
name = models.CharField(max_length=40, null=True, blank=True)
surname = models.CharField(max_length=40, null=True, blank=True)
objects = UserManager()
自定义模型的序列化程序:
class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = Group
fields = ('id', 'name', 'subject', 'user')
以及具有覆盖create
方法的视图集:
class GroupViewSet(viewsets.ModelViewSet):
serializer_class = GroupSerializer
def create(self, request, *args, **kwargs):
group = group.objects.create(user=self.request.user)
serializer = GroupSerializer(group)
return Response(serializer.data)
调用 POST 时Group
会创建一个新的。与Group
有关系User
,但其他字段(名称、主题)为空。
另一方面,在做请求序列化的时候,User
on对象是空的。
def create(self, request, *args, **kwargs):
serializer = GroupSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我如何连接这两个以使其工作?
解决方案
这是有道理的,因为您从未使用序列化程序来反序列化请求,因此读取了 POST 请求中传递的详细信息。您可以使用:
def create(self, request, *args, **kwargs):
serializer = GroupSerializer(data=request.data)
if serializer.is_valid():
serializer.save(user=self.request.user)
else:
# return response when the serializer rejects the input
pass
# return a response
pass
在序列化程序中,您将user
字段标记为read_only
,以防止序列化程序在user
不是请求的一部分时失败:
class GroupSerializer(serializers.ModelSerializer):
class Meta:
model = Group
fields = ('id', 'name', 'subject', 'user')
read_only_fields = ('user', )
推荐阅读
- python - 用于 GUI 测试的 PyAutoGUI 的替代品
- css - 为什么要居中
标签太难了。我在试图集中注意力时感到头疼
带引导程序 - python - 变量不在 Jupyter Notebook 的变量资源管理器中
- node.js - 编剧自动化无法绕过位置弹出窗口
- r - 仅在广告的每一列中查找唯一值
- perl - 由于使用严格的 [ => (fat comma) operator],在 MIME Lite 错误中回复
- lean - 将 nat 的证明转换为非负整数的证明
- python - Python 两个列表合二为一,但位置保持不变
- react-native - 如何在 Vue Native 中执行 onAuthStateChanged?
- android - 初始化 ADB 时出错 无法创建调试桥 无法启动 ADB 服务器 进程没有在指定的超时时间内终止,杀死它的服务器