dj鲜生-34-存档-用户中心地址页重复查询默认地址的优化-利用自定义模型管理器的方法来实现

复习模型类管理器

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地址功能完成)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲸鱼编程pyhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值