Django 模型(四)管理器和元选项

2016/05/12 Django 阅读次数:

自定义管理器

  • str():在将对象转换成字符串时会被调用。

  • save():将模型对象保存到数据表中,ORM框架会转换成对应的insert或update语句。

  • delete():将模型对象从数据表中删除,ORM框架会转换成对应的delete语句。

属性objects:管理器,是models.Manager类型的对象,用于与数据库进行交互。

当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。

自定义管理器类主要用于两种情况:

  • 1.修改原始查询集,重写all()方法
  • 2.向管理器类中添加额外的方法,如向数据库中插入数据。

1.修改原始查询集,重写all()方法。 必须继承models.Manager

a)打开booktest/models.py文件,定义类BookInfoManager

#图书管理器
class BookInfoManager(models.Manager):
    def all(self):
    #默认查询未删除的图书信息
    #调用父类的成员语法为:super().方法名
    return super().all().filter(isDelete=False)
    ```
    
# 在模型类BookInfo中定义管理器

class BookInfo(models.Model):
    
    books = BookInfoManager()

2.在管理器类中定义创建对象的方法

对模型类对应的数据表进行操作时,推荐将这些操作数据表的方法封装起来,放到模型管理器类中。

a)打开booktest/models.py文件,定义方法create。

class BookInfoManager(models.Manager):
    ...
    #创建模型类,接收参数为属性赋值
    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.isDelete = False
        # 将数据插入进数据表
        book.save()
        return book

b)为模型类BookInfo定义管理器books语法如下

class BookInfo(models.Model):

    books = BookInfoManager()

c)调用语法如下:

调用:book=BookInfo.books.create_book("abc",date(1980,1,1))

元选项

创建抽象类,创建数据表时不创建:

class Meta:

abstract = True

创建抽象类,指标数据表名字:

class Meta:

db_table = 'my_Teacher'
多类的对象. 关联属性_id
例:查询图书信息,要求图书关联的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt=3)
例:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle='天龙八部')
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)

Search

    Table of Contents