Django-模型成员

类属性:

  • 显性属性:开发者手动书写的属性
  • 隐性属性:objects是Manager类型的一个对象,作用于数据库进行交互。

当模型没有指定管理器的时候,Django会为我们自动创建模型管理器。当然,我们也可以自定义管理器。当自定义管理器时,objects就不存在了,Django不会为我们自动生成模型管理器了。


1 手动声明用例

  1. 模型定义
urlpatterns=[
    url(r'^getanimal/',views.getanimal)
]


class Animal(models.Model):
    a_name = models.CharField(max_length=32)

	# 手动声明Manager对象。
    a_manager = models.Manager()
  1. 数据准备
    在这里插入图片描述

  2. 视图函数

def getanimal(request):
    animals = Animal.objects.all()

    for animal in animals:
        print(animal.a_name)

    return HttpResponse('获取成功')
  1. 访问结果
    在这里插入图片描述
    原因是我们手动声明了Manager对象,Django不会自动生成了。

调用方式发生了改变。

修改视图函数:

def getanimal(request):
    animals = Animal.a_manager.all()		# 修改为我们声明的类属性

    for animal in animals:
        print(animal.a_name)

    return HttpResponse('获取成功')

可以成功访问了!
在这里插入图片描述
控制台打印数据:

Cat
Dog
Duck
Chicken

2 批量操作

现在我们在模型定义中添加一列逻辑删除字段

  1. 修改后的模型定义
class Animal(models.Model):
    a_name = models.CharField(max_length=32)
    is_delete = models.BooleanField(default=False)		# 软删除字段
  1. 更新数据
    在这里插入图片描述

  2. 视图函数:
    查询逻辑上没有被删除的数据。

def getanimal(request):

	# 按照正常写法是这样的
    animals = Animal.a_manager.filter(is_delete=False)

    for animal in animals:
        print(animal.a_name)

    return HttpResponse('获取成功')

但是上述写法每次我们查询数据都要写上filter(is_delete=False),过于麻烦,如果可以每次不写,默认查询现有数据该多好啊!没错,可以通过重写方法实现

通过观察模型类.objects.all()源码发现,可以重写方法get_queryset()

    def all(self):
        # We can't proxy this method through the `QuerySet` like we do for the
        # rest of the `QuerySet` methods. This is because `QuerySet.all()`
        # works by creating a "copy" of the current queryset and in making said
        # copy, all the cached `prefetch_related` lookups are lost. See the
        # implementation of `RelatedManager.get_queryset()` for a better
        # understanding of how this comes into play.
        return self.get_queryset()
  1. 重构上述代码
  • 重构模型定义
'''
创建自己的Manager类
'''
class AnimalManager(models.Manager):
    def get_queryset(self):
    	# 手动添加filter
        return super(AnimalManager, self).get_queryset().filter(is_delete=False)


class Animal(models.Model):
    a_name = models.CharField(max_length=32)
    is_delete = models.BooleanField(default=False)

	# objects 为了通用,伪装成系统自带的objects 
    objects = AnimalManager()
  • 改写视图函数
def getanimal(request):

	# 更改后的写法,all()
    animals = Animal.a_manager.all()
    for animal in animals:
        print(animal.a_name)

    return HttpResponse('获取成功')
  • 访问,并打印控制台
Cat
Duck
Chicken
发布了66 篇原创文章 · 获赞 4 · 访问量 2123

猜你喜欢

转载自blog.csdn.net/weixin_43999327/article/details/104109677
今日推荐