【问题标题】:Django Rest Framework: best way to populate field manuallyDjango Rest Framework:手动填充字段的最佳方法
【发布时间】:2014-10-17 03:00:03
【问题描述】:

考虑以下模型:

class Request(models.Model):
    user = models.ForeignKey('User', related_name='requests')

还有一个带有创建/更新的视图集:

class RequestViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):

我只想在创建时设置用户,而不是在更新时设置用户

第一个解决方案:

class RequestViewSet(mixins.CreateModelMixin, mixins.UpdateModelMixin, viewsets.GenericViewSet):
    def pre_save(self, obj):
        create = False
        try:
            if not obj.user:
                create = True
        except ObjectDoesNotExist:
            create = True
        if create:
            obj.user = self.request.user

使用 restore_object 的第二种解决方案:

class RequestSerializer(serializers.ModelSerializer):
    def restore_object(self, attrs, instance=None):
        create = not instance
        instance = super(RequestSerializer, self).restore_object(attrs, instance)
        if create:
            request = self.context['request']
            instance.user = request.user
        return instance

什么更符合逻辑? 我更喜欢第一个(除了 try/except 但我没有其他选择)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我不太喜欢基于类的视图,我更喜欢胖模型和瘦视图。

    我会在 Request 上选择 post_save 信号并检查创建的参数。

    https://docs.djangoproject.com/en/dev/ref/signals/#post-save

    Request(...):
        @classmethod
        def post_save(cls, sender, instance, created, raw, **kwargs):
            if raw:
                return
            if created:
                pass  # do your on create stuff here
    
    post_save.connect(Request.post_save, sender=Request, dispatch_uid="uniqueid")  # use weak=False if you use a local function
    

    还要注意 instance.save() 会再次触发保存信号,因此如果您想避免再次处理所有信号(或者更糟糕的是,创建一个信号循环),您可以考虑只使用 .update() ; -))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2017-01-13
      • 2018-11-10
      • 1970-01-01
      相关资源
      最近更新 更多