需要Assistane将django模型管理员保存方法转换为Django Rest Framework

时间:2017-03-12 13:32:27

标签: django django-rest-framework

我需要帮助在Django Rest Framework上转换下面的save_model方法 我在我之前的django model admin

上有这个方法

现有ModelAdmin

class JobCategoryAdmin(admin.ModelAdmin):
    exclude = ('remote_addr',)
    list_display = ['job_category','updated_by','updated_at','created_by','created_at','remote_addr',]
    save_as = True

    def save_model(self, request, obj, form, change):
        if change:  #When update
            obj.updated_by = request.user
            obj.updated_at = datetime.now()
            obj.remote_addr = request.META['REMOTE_ADDR']
        else:     #When Create
            obj.created_by = request.user
            obj.created_at = datetime.now()
            obj.updated_by = request.user
            obj.remote_addr = request.META['REMOTE_ADDR']
        obj.save()

我需要在我的DRF方法上应用它。目前我这样做。

串行

class JobCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = JobCategory
        fields = ('job_category', )

    def create(self,validated_data):
        obj =  JobCategory.objects.create(**validated_data)
        obj.created_by = self.context['request'].user
        obj.updated_by = self.context['request'].user
        obj.remote_addr  = self.context['request'].META['REMOTE_ADDR']
        obj.save()
        return obj

    def update(self,instance,validated_data):
        obj = instance
        obj.job_category = validated_data.get('job_category', obj.job_category)
        obj.updated_by = self.context['request'].user
        obj.remote_addr  = self.context['request'].META['REMOTE_ADDR']
        obj.save()
        return obj

这里我对更新感到不舒服,因为我需要再次传递所有数据,而我在现有的save_model的modelAdmin方法中没有这样做。示例ob_category字段,当我从X更新为Y时,我不想在我的更新方法中调用它。

当它是一个字段时它仍然是可以接受的,但是如果我需要为一个模型做它可以说20个字段并且我只更新其中一个字段那么我需要在我的更新方法中指定所有字段

模型

class JobCategory(models.Model):
    job_category   = models.CharField(max_length=30,blank=False,null=False, unique=True,help_text="eg: DATASTAGE, CUSTOM_COMMAND" )
    created_by  = models.ForeignKey(User, related_name='const_jc_created_by_user',blank=True, null=True, default=None, editable=False)
    updated_by  = models.ForeignKey(User, related_name='const_jc_updated_by_user', blank=True, null=True, default=None, editable=False)
    created_at  = models.DateTimeField(auto_now_add=True)
    updated_at  = models.DateTimeField(auto_now=True)
    remote_addr = models.CharField(blank=True, default='',max_length=100)

    class Meta:
        ordering = ["job_category"]
        verbose_name_plural = "Job Categories"

    def __str__(self):              # __unicode__ on Python 2
        return self.job_category

视图

class JobCategoryDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = JobCategory.objects.all()
    serializer_class = JobCategorySerializer

感谢您的协助

1 个答案:

答案 0 :(得分:1)

  

当它是一个字段时它仍然是可以接受的,但是如果我需要为一个模型做它可以说20个字段并且我只更新其中一个字段那么我需要在我的更新方法中指定所有字段

这可以通过以下方式解决:

for attr in ('job_category', ...):
    setattr(obj, attr, validated_data.get(attr, getattr(obj, attr))

请注意,您还可以循环使用validated_data.keys()以使其更通用。