ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django-模型成员

2020-01-29 21:07:18  阅读:283  来源: 互联网

标签:Animal animals name models 模型 Django objects animal 成员


类属性:

  • 显性属性:开发者手动书写的属性
  • 隐性属性: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 · 访问量 2124 私信 关注

标签:Animal,animals,name,models,模型,Django,objects,animal,成员
来源: https://blog.csdn.net/weixin_43999327/article/details/104109677

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有