2022/08/16-学习笔记(二)-drf公用model

学习笔记

通过学习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)·

判断对象中是否包含对应的属性
上述代码实现了自动更新模型的公用字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值