Django学习笔记(二十一):自定义管理工具

32 篇文章 8 订阅

自定义管理工具

使用场景

当系统给我们提供的objects不满足你全部需求的时候,你可以定义一个管理类

比如:我需要经常给木叶村添加忍者

使用方法

在models.py代码

写一个继承models.Manager的一个类,在这个类里写自己额外的需求

#实现迅速生成木叶村的忍者
class StudentManager(models.Manger):
    def create_student(self):
#创建一个忍者数据
        student = Student()
        student.sname = "编号" + str(random.randint(0,100))
        student.sage = random.randrange(100)
        student.sgrade_id = 1
        student.save()
        return student

#忍者类
class Students(models.Model):
    sname = models.CharField(max_length=20,
                             verbose_name='学生名字')
    sgender = models.BooleanField(default=True,
                                  verbose_name='性别')
    sage = models.IntegerField(verbose_name='年龄')
    sgrade = models.ForeignKey('Grade',
                               verbose_name='所属班级')
    object = models.Manager()
    my_objects_one = StudentManager()

在views.py里调用这个方法生成一个忍者数据

def create_one_student(req):
    student = Students.my_objects_one.create_student()
    return HttpResponse(student)

随即在数据库中得到创建的数据

 

另一个例子

        try:
            address = Address.objects.get(user=user,is_default=True)
        except Address.DoesNotExist:
            # 不存在默认收货地址
            address = None

这样一条orm查询需要多次使用,我们可以试着把它封装起来

在对应的models文件中,新建一个类

class AddressManager(models.Manager):
    '''地址模型管理器类'''
    # 1.改变原有查询的结果集:all()
    # 2.封装方法:用户操作模型类对应的数据表(增删改查)
    def get_default_address(self, user):
        '''获取用户默认收货地址'''
        # self.model:获取self对象所在的模型类
        try:
            address = self.get(user=user,is_default=True) # model.Manager
        except self.model.DoesNotExist:
            # 不存在默认收货地址
            address = None

        return address

class Address(BaseModel):
    '''地址模型类'''
    user = models.ForeignKey('User', verbose_name='所属账户')
    receiver = models.CharField(max_length=20, verbose_name='收件人')
    addr = models.CharField(max_length=256, verbose_name='收件地址')
    zip_code = models.CharField(max_length=6, null=True, verbose_name='邮政编码')
    phone = models.CharField(max_length=11, verbose_name='联系电话')
    is_default = models.BooleanField(default=False, verbose_name='是否默认')

    # 自定义一个模型管理器对象
    objects = AddressManager()

    class Meta:
        db_table = 'df_address'
        verbose_name = '地址'
        verbose_name_plural = verbose_name

完成这个自定义模型管理对象的创建后,之前的那个判断就可以简化为

address = Address.objects.get_default_address(user)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值