【问题标题】:DRF how to save a model with a foreign key to the User objectDRF如何将具有外键的模型保存到用户对象
【发布时间】:2015-12-01 10:29:06
【问题描述】:

我有以下型号:

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 标头中传递一个可以识别用户的令牌。根据this post,我可以使用 request.META('whatever') 从标头中提取此令牌密钥。然后我将能够根据令牌检索用户实例。

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

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    当您通过令牌正确验证时,您应该在请求对象中有一个可用的用户属性。

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

    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)
    

    【讨论】:

      【解决方案2】:

      这应该可行。

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

      如果您需要任何进一步的说明或遇到任何问题,请发表评论。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2016-09-03
        • 2018-06-02
        相关资源
        最近更新 更多