Django-模型成员

落日映苍穹つ 2023-07-02 11:28 89阅读 0赞

类属性:

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

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


1 手动声明用例

  1. 模型定义

    urlpatterns=[

    1. url(r'^getanimal/',views.getanimal)

    ]

  1. class Animal(models.Model):
  2. a_name = models.CharField(max_length=32)
  3. # 手动声明Manager对象。
  4. a_manager = models.Manager()
  1. 数据准备
    在这里插入图片描述
  2. 视图函数

    def getanimal(request):

    1. animals = Animal.objects.all()
    2. for animal in animals:
    3. print(animal.a_name)
    4. return HttpResponse('获取成功')
  3. 访问结果
    在这里插入图片描述
    原因是我们手动声明了Manager对象,Django不会自动生成了。

调用方式发生了改变。

修改视图函数:

  1. def getanimal(request):
  2. animals = Animal.a_manager.all() # 修改为我们声明的类属性
  3. for animal in animals:
  4. print(animal.a_name)
  5. return HttpResponse('获取成功')

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

  1. Cat
  2. Dog
  3. Duck
  4. Chicken

2 批量操作

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

  1. 修改后的模型定义

    class Animal(models.Model):

    1. a_name = models.CharField(max_length=32)
    2. is_delete = models.BooleanField(default=False) # 软删除字段
  2. 更新数据
    在这里插入图片描述

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

    def getanimal(request):

    1. # 按照正常写法是这样的
    2. animals = Animal.a_manager.filter(is_delete=False)
    3. for animal in animals:
    4. print(animal.a_name)
    5. return HttpResponse('获取成功')

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

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

  1. def all(self):
  2. # We can't proxy this method through the `QuerySet` like we do for the
  3. # rest of the `QuerySet` methods. This is because `QuerySet.all()`
  4. # works by creating a "copy" of the current queryset and in making said
  5. # copy, all the cached `prefetch_related` lookups are lost. See the
  6. # implementation of `RelatedManager.get_queryset()` for a better
  7. # understanding of how this comes into play.
  8. return self.get_queryset()
  1. 重构上述代码

    • 重构模型定义

    ‘’’
    创建自己的Manager类
    ‘’’
    class AnimalManager(models.Manager):

    1. def get_queryset(self):
    2. # 手动添加filter
    3. return super(AnimalManager, self).get_queryset().filter(is_delete=False)
  1. class Animal(models.Model):
  2. a_name = models.CharField(max_length=32)
  3. is_delete = models.BooleanField(default=False)
  4. # objects 为了通用,伪装成系统自带的objects
  5. objects = AnimalManager()
  • 改写视图函数

    def getanimal(request):

    1. # 更改后的写法,all()
    2. animals = Animal.objects.all()
    3. for animal in animals:
    4. print(animal.a_name)
    5. return HttpResponse('获取成功')
  • 访问,并打印控制台

    Cat
    Duck
    Chicken

发表评论

表情:
评论列表 (有 0 条评论,89人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Django模型

    Django 模型 Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。 Django 为这些数据库提供了

    相关 Django模型

    Django模型 Django对各种数据库提供了很好的支持。包括MySQL,SQLite,Orcale等。 Django为这些数据库提供了统一的调用api。可以根据不同

    相关 Django 模型

    Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要