2014-10-16 103 views
0

考虑以下模型:Django的REST框架:填充领域的最佳方式手动

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 

更重要的是合理的? 我倾向于更喜欢第一个(除了尝试/除了我找不到替代它)

回答

1

我不喜欢基于类的观点的大粉丝,我更喜欢胖的模型和薄意见。

我会在请求上选择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()(甚至更糟,创建一个信号循环;-))