django类视图与数据库操作管理器

使用类视图是使用了操作对象的方式来操作视图,比函数视图要强

'''
    as_view() 函数,表明如果请求方式在['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
    之中,那么就调用该函数!
    以函数的方式定义的视图称为函数视图,函数视图便于理解。
    但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,
    便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。
    因此便将请求封装到一个类之中!
'''
#类视图的定义方法
urlpatterns = [
    # 指定类装饰器!
    url(r'^register', views.RegisterView.as_view()),
]

使用类视图主要是为了更好的解决一个url之中有可能有多个请求,在views.py之中定义类视图

class RegisterView(View):

    def get(self, request):
        return HttpResponse('这是get 请求!')

    def post(self, request):
        return HttpResponse('这是post 请求!')

    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
可以为类视图增加一个装饰器添加新的功能
#定义装饰器
def set_fun(func):
    def call_fun(request, *args, **kwargs):
        print('这是装饰器!')
        return func(request, *args, **kwargs)

    return call_fun


# 指定装饰函数!可以指定get post 如果指定了 dispatch 表明可以随着请求的不同进行不同的装饰!
@method_decorator(set_fun, name='dispatch')
class RegisterView(View):

    @method_decorator(set_fun)
    def get(self, request):
        return HttpResponse('这是get 请求!')

    def post(self, request):
        return HttpResponse('这是post 请求!')

    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)
View Code

数据库操作管理器是数据操作的接口,如果自定义了管理器那么就不能使用自带的管理器

'''管理器是数据操作的接口!有时候自定义管理器!
    实际上,模型管理器是定义了类重写或者新增管理器类的方法!
    这样就使用类调用属性的方式来使用自定义的模型管理器!
'''

class BookInfoManager(models.Manager):
    # 重写all方法!(没什么用!)
    def all(self):
        # 默认查询未删除的图书信息
        # 调用父类的成员语法为:super().方法名
        return super().filter(is_delete=False)

    # 定义管理器创建实例化对象!
    def create_book(self, title, pub_date):
        # 创建模型类对象self.model可以获得模型类
        book = self.model()
        book.btitle = title
        book.bpub_date = pub_date
        book.bread = 0
        book.bcommet = 0
        book.is_delete = False
        # 将数据插入进数据表
        book.save()
        return book


# 定义图书模型类BookInfo
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_books'  # 指明数据库表名
        verbose_name = '图书'  # 在admin站点中显示的名称
        verbose_name_plural = verbose_name  # 显示的复数名称

    def __str__(self):
        """定义每个数据对象的显示信息"""
        return self.btitle

    # 通过类属性来创建管理器对象!
    books = BookInfoManager()
View Code

 

posted @ 2018-06-14 23:23  十七楼的羊  阅读(194)  评论(0编辑  收藏  举报