学习笔记
通过学习github开源代码,增加自己对drf的理解
一、Model的扩展
将多个model中通用的creator、description、create_time、update_time等字段提取出来,creator直接与user建立外键关系。
class CoreModel(models.Model):
class Meta:
abstract = True
问题 如何进行该字段的增删改查?
二 重写Serializer
回答上面问题,进行该字段的 增删改查,应该在序列化里进行,需要重新做一个Serializer.
class CustomModelSerializer(ModelSerializer):
modifier_field_id = 'modifier'
modifier_name = serializers.SerializerMethodField(read_only=True)
def get_modifier_name(self, instance):
if not hasattr(instance,'modifier'):
return None
queryset = Users.objects.filter(id=instance.modifier).values_list('name', flat=True).first()
if queryset:
return queryset
return None
creator_field_id = 'creator'
creator_name = serializers.SlugRelatedField(slug_field="name", source="creator", read_only=True)
dept_belong_id_field_name = 'dept_belong_id'
create_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_datetime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False)
def create(self, validated_data):
if self.request:
if self.modifier_field_id in self.fields.fields:
validated_data[self.modifier_field_id] = self.get_request_user_id()
if self.creator_field_id in self.fields.fields:
validated_data[self.creator_field_id] = self.request.user
if self.dept_belong_id_field_name in self.fields.fields and validated_data.get(self.dept_belong_id_field_name, None):
validated_data[self.dept_belong_id_field_name] = getattr(self.request.user, 'dept_id', None)
return super().create(validated_data)
def update(self, instance, validated_data):
if self.request:
if hasattr(self.instance, self.modifier_field_id):
self.instance.modifier = self.get_request_username()
return super().update(instance, validated_data)
查看源码,发现很多getattr,重新温习下反射相关知识
getattr(object, name[, default])·
返回对象属性,如name在object里,返回name值。如果name未在object里,将触发AttribeError.但如果default有默认值,则返回默认值。
hasattr(object, name)·
判断对象中是否包含对应的属性
上述代码实现了自动更新模型的公用字段。