DRF如何将带有外键的模型保存到User对象

Che*_*eng 2 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)
Run Code Online (Sandbox Code Playgroud)

我想在用户提交表单时保存此模型的记录。所有必填字段的值都与表单一起提交,因此我认为request.data将在其中包含这些creator字段(字段除外)。

由于我使用令牌身份验证,因此可以在HTTP标头中传递可以标识用户的令牌。根据这篇文章,我可以使用request.META('whatever')从标题中拉出此令牌密钥。然后,我将能够基于令牌检索用户实例。

到目前为止,我的问题是下一步,如何编写一个可以在保存时接收request.data和用户实例的序列化程序?

我认为我应该使用ModelSerializer基于上述定义的模型。但是,如何将用户实例转换为可序列化的形式,以便ModelSerializer在保存时可以使用它们?

mar*_*dev 5

如果通过令牌正确地进行了身份验证,则应该在请求对象中提供一个用户属性。

因此,根据在何处添加用于传递用户对象的逻辑,可以在通用视图中使用它:

def perform_create(self, serializer):
    serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

或在序列化器内部(假设您的视图已通过context):

def create(self, validated_data):
    data = validated_data.copy()
    data['user'] = self.context['request'].user

    return super(JournalSerializer, self).create(data)
Run Code Online (Sandbox Code Playgroud)