复习模型类管理器
django-模型类管理器 - pyhui的python全栈技术博客 - CSDN博客
https://blog.csdn.net/ifubing/article/details/100165287
django-模型类管理器-create方法-models属性 - pyhui的python全栈技术博客 - CSDN博客
https://blog.csdn.net/ifubing/article/details/100172432
回看地址的代码,有重复的地方
不论在get还是在post中都有用到
查找用户的默认地址
》代码重复,需要优化
考虑,利用模型类管理器
自定义一个方法
直接调用方法,把这些大段的代码封装在方法中
一,导入models模块,如果有这个模块跳过此步骤
from django.db import models
一般管理器写在应用的models模块中
models导好了,可以直接使用
二,自定义一个类,让类继承自models.Manager
同时可以写一个自定义的方法
三 让模型类与模型类管理器产生关联
类属性 = 模型类管理器的实例化对象
例如
class Address(BaseModel):
"""地址模型类"""
user = models.ForeignKey("User", verbose_name="所属帐户", on_delete=models.CASCADE)
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
四,管理器中的方法完善
》get_default_address 方法是用于查询一个用户的默认地址,并且返回
参数:
查询哪个用户?得告诉方法
返回值:
查到默认地址,就返回这一条数据行对象
查询不到,就返回一个None
》继续写代码
基本上是把视图中的查,代码搬到这里的
功能的优化一, 管理器对象.model结果为模型类
在管理器中
管理器对象的model 属性,返回它所修饰的类名称
即,self.model 代表了Address 类
所以代码可以改为:
这样的好处是
如果将来把地址的类名变更了,也不怕
例如:。。。。。
》扩展,复习一下描述符,如何获取类
功能再优化
即然self.model代表了Address表
一, 明确self是什么
二,self.model.objects是什么
三,可以如何优化?
代码
代码
class AddressManager(models.Manager):
"""地址视图的模型类管理器"""
def get_default_address(self, user):
"""获取用户的默认收货地址"""
try:
# address = Address.objects.get(user=user, is_default=True)
# address = self.model.objects.get(user=user, is_default=True)
address = self.get(user=user, is_default=True)
except Address.DoesNotExist:
address = None
return address
class Address(BaseModel):
"""地址模型类"""
user = models.ForeignKey("User", verbose_name="所属帐户", on_delete=models.CASCADE)
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
在视图类中应用
由于没有对表结构造成引响
虽然动了模型类,不过不用再次迁移了
在get方法中
post方法中
把相关代码进行替换
试一试效果
页面正常显示
管理器运行正常
小结
通过本例
复习了模型类管理器的用法
代码存档
https://cloud.189.cn/t/J3aua2nYz2qu (191005地址功能完成)