DJANGO-天天生鲜项目从0到1-004-用户模块-个人中心页

本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习

https://www.bilibili.com/video/BV1vt41147K8?p=1

自定义模型管理器类(models.Manager)

一般我们会使用预定义的模型的管理器类的方法去进行一些操作,比如查询地址模型类的所有数据:Address.objects.all(),其中Address.objects返回的就是models.Manager的对象

当我们需要重写一些预定义的方式时,如重写.all(),让其默认添加一些筛选条件;或者想让新增自定义的方法时,就需要重新定义models.Manager类

这里我们让地址类返回用户默认的收货地址:

在models.py中的原模型类上添加objects属性:objects = Address.Manager()

class Address(BaseModel):
    '''地址模型类'''
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    receiver = models.CharField(verbose_name='收货人', max_length=120)
    address = models.CharField(verbose_name='收货地址', max_length=400)
    zip_code = models.CharField(verbose_name='邮编', max_length=6, null=True)
    phone = models.CharField(verbose_name='电话号码', max_length=11)
    is_default = models.BooleanField(verbose_name='是否默认', default=False)

    objects = AddressManager()

在models.py中新增Address.Manager()类

class AddressManager(models.Manager):
'''用户地址模型管理器类'''

# 自定义模型管理器类,用来修改原有方法或者新增方法
def get_default_address(self, user):
    '''获取用户默认收货地址'''
    try:
        address = self.get(user=user, is_default=True)
    except Address.DoesNotExist:
        address = None
    return address

在视图中直接调用Address.objects.get_default_address(request.user)

def get(self, request):                                        
    '''显示用户收货地址'''                                     
    self.context['type'] = 'address'                           
    # 获取默认收货地址                                         
    address = Address.objects.get_default_address(request.user)
    self.context['address'] = address                          
    return render(request, self.template_name, self.context)   

使用django-redis实现django与redis交互

django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cache/session 后端的全功能组件.

安装django-redis

pip install django-redis

修改caches缓存设置

# django 缓存设置cache: 使用redis数据库当做缓存的存储位置

CACHES = {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379/1",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
    }
  }
}

连接redis数据库

原始连接写法:StrictRedis

这种写法只需要pip install redis即可,没有用到上面的djang-redis

from redis import StrictRedis
#创建连接对象
connect = StrictRedis(host='localhost', port=6379, db=0)
#简写
#connect=StrictRedis()
#操作数据库
result = connect.set('name', 'gong')

使用djang-redis:get_redis_connection

这种写法使用到了上面配置的连接‘default’

from django_redis import get_redis_connection

# 获取历史浏览记录                                          
# 连接redis数据库                                           
connect = get_redis_connection('default')                   
# 获取当前用户key值,格式为history_userid                    
history_key = 'history_%d'%(user.id)                        
# 获取最新的五条历史记录                                    
history_list = connect.lrange(history_key, 0, 4)            
# 获取商品对象                                              
goods_list = [Goods.objects.get(id=i) for i in history_list]

https://www.bilibili.com/video/BV1vt41147K8?p=1

自定义模型管理器类(models.Manager)

一般我们会使用预定义的模型的管理器类的方法去进行一些操作,比如查询地址模型类的所有数据:Address.objects.all(),其中Address.objects返回的就是models.Manager的对象

当我们需要重写一些预定义的方式时,如重写.all(),让其默认添加一些筛选条件;或者想让新增自定义的方法时,就需要重新定义models.Manager类

这里我们让地址类返回用户默认的收货地址:

在models.py中的原模型类上添加objects属性:objects = Address.Manager()

class Address(BaseModel):
    '''地址模型类'''
    user = models.ForeignKey('User', on_delete=models.CASCADE)
    receiver = models.CharField(verbose_name='收货人', max_length=120)
    address = models.CharField(verbose_name='收货地址', max_length=400)
    zip_code = models.CharField(verbose_name='邮编', max_length=6, null=True)
    phone = models.CharField(verbose_name='电话号码', max_length=11)
    is_default = models.BooleanField(verbose_name='是否默认', default=False)

    objects = AddressManager()

在models.py中新增Address.Manager()类

class AddressManager(models.Manager):
'''用户地址模型管理器类'''

# 自定义模型管理器类,用来修改原有方法或者新增方法
def get_default_address(self, user):
    '''获取用户默认收货地址'''
    try:
        address = self.get(user=user, is_default=True)
    except Address.DoesNotExist:
        address = None
    return address

在视图中直接调用Address.objects.get_default_address(request.user)

def get(self, request):                                        
    '''显示用户收货地址'''                                     
    self.context['type'] = 'address'                           
    # 获取默认收货地址                                         
    address = Address.objects.get_default_address(request.user)
    self.context['address'] = address                          
    return render(request, self.template_name, self.context)   

使用django-redis实现django与redis交互

django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cache/session 后端的全功能组件.

安装django-redis

pip install django-redis

修改caches缓存设置

# django 缓存设置cache: 使用redis数据库当做缓存的存储位置

CACHES = {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379/1",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
    }
  }
}

连接redis数据库

原始连接写法:StrictRedis

这种写法只需要pip install redis即可,没有用到上面的djang-redis

from redis import StrictRedis
#创建连接对象
connect = StrictRedis(host='localhost', port=6379, db=0)
#简写
#connect=StrictRedis()
#操作数据库
result = connect.set('name', 'gong')

使用djang-redis:get_redis_connection

这种写法使用到了上面配置的连接‘default’

from django_redis import get_redis_connection

# 获取历史浏览记录                                          
# 连接redis数据库                                           
connect = get_redis_connection('default')                   
# 获取当前用户key值,格式为history_userid                    
history_key = 'history_%d'%(user.id)                        
# 获取最新的五条历史记录                                    
history_list = connect.lrange(history_key, 0, 4)            
# 获取商品对象                                              
goods_list = [Goods.objects.get(id=i) for i in history_list]

猜你喜欢

转载自www.cnblogs.com/gcxblogs/p/12799917.html
今日推荐