自定义管理工具
使用场景
当系统给我们提供的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)