我需要帮助在Django Rest Framework上转换下面的save_model方法 我在我之前的django model admin
上有这个方法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
感谢您的协助
答案 0 :(得分:1)
当它是一个字段时它仍然是可以接受的,但是如果我需要为一个模型做它可以说20个字段并且我只更新其中一个字段那么我需要在我的更新方法中指定所有字段
这可以通过以下方式解决:
for attr in ('job_category', ...):
setattr(obj, attr, validated_data.get(attr, getattr(obj, attr))
请注意,您还可以循环使用validated_data.keys()以使其更通用。