类属性:
-
显性
属性:开发者手动书写的属性 -
隐性
属性:objects是Manager
类型的一个对象,作用于数据库进行交互。
当模型没有指定管理器的时候,Django会为我们自动创建模型管理器。当然,我们也可以自定义
管理器。当自定义管理器时,objects就不存在了,Django不会为我们自动生成模型管理器了。
1 手动声明用例
- 模型定义:
urlpatterns=[
url(r'^getanimal/',views.getanimal)
]
class Animal(models.Model):
a_name = models.CharField(max_length=32)
# 手动声明Manager对象。
a_manager = models.Manager()
-
数据准备:
-
视图函数:
def getanimal(request):
animals = Animal.objects.all()
for animal in animals:
print(animal.a_name)
return HttpResponse('获取成功')
-
访问结果:
原因是我们手动声明了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 批量操作
现在我们在模型定义中添加一列逻辑删除字段
。
- 修改后的模型定义
class Animal(models.Model):
a_name = models.CharField(max_length=32)
is_delete = models.BooleanField(default=False) # 软删除字段
-
更新数据
-
视图函数:
查询逻辑上没有被删除的数据。
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()
- 重构上述代码
- 重构模型定义
'''
创建自己的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 · 访问量 2124
私信
关注