DRF如何使用外键将模型保存到User对象

时间:2015-12-01 10:29:06

标签: django django-rest-framework

我有以下型号:

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在保存时可以消耗?

2 个答案:

答案 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()

如果您需要进一步澄清或面临任何问题,请发表评论。