我有以下型号:
class Journal(models.Model):
project_name = models.TextField()
intro = models.TextField(blank=True)
start_time = models.DateTimeField()
end_time = models.DateTimeField()
creator = models.ForeignKey(User)
group = models.OneToOneField(Group)
contact_info = models.TextField(blank=True)
allow_anon = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
我想在用户提交表单时保存此模型的记录。所有必填字段的值都与表单一起提交,因此我假设 request.data 除了creator
字段外都会包含它们。
由于我使用令牌身份验证,因此可以在HTTP标头内传递可识别用户的令牌。根据{{3}},我可以使用 request.META('whatever')从标头中提取此令牌密钥。然后我将能够根据令牌检索用户实例。
到目前为止,我的问题是下一步,如何编写一个可以在保存时使用 request.data 和用户实例的序列化程序?
我想我应该根据上面定义的模型使用ModelSerializer
。但是,如何将用户实例转换为可序列化的形式,以便ModelSerializer
在保存时可以消耗?
答案 0 :(得分:3)
如果您通过令牌正确验证,那么您应该在请求对象中提供用户属性。
因此,根据您添加传递用户对象的逻辑的位置,您可以在通用视图中使用它:
def perform_create(self, serializer):
serializer.save(user=self.request.user)
或在序列化程序内部(假设您的视图正在传递context
):
def create(self, validated_data):
data = validated_data.copy()
data['user'] = self.context['request'].user
return super(JournalSerializer, self).create(data)
答案 1 :(得分:0)
这应该有用。
data = request.data
data['creator'] = user_id # fetch user_id from metadata first
serializer = YourSerializer(data=data, partial=True)
if serializer.is_valid():
serializer.save()
如果您需要进一步澄清或面临任何问题,请发表评论。