models.py代码如下:

from django.db import models

# Create your models here.

# 增加额外的Manager方法
# 为Book模型定义一个title_count()方法,它需要一个关键字,返回包含这个关键字的书的数量
class BookManager(models.Manager):
    def title_count(self, keyword):
        return self.filter(title__icontains=keyword).count()


class Book(models.Model):
    title=models.CharField(max_length=100)
    authors=models.ManyToManyField(Author)
    publisher=models.ForeignKey(Publisher,on_delete=models.CASCADE)
    publication_date=models.DateField()
    # 添加一个num_pages字段
    # blank=True,null=True用于“设置可选字段”以及“添加非空列”
    # num_pages=models.IntegerField(blank=True,null=True)
    objects=BookManager()

    def __unicode__(self):
        return self.title

    def __str__(self):
        return self.title

其中BookManeger类继承了models.Manager类,用于进行自定义Manager方法。

通过以下命令来检测自定义的方法的可用性:

>>> from books.models import Book
>>> Book.objects.title_count('django')
2

输出结果表示方法能够正常运行。

但是在运行成功之前报错:AttributeError: 'Manager' object has no attribute 'title_count'

发现错误的原因有两处:

(1)class BookManager(models.Manager):这里应该继承与models.Manager而不是models.Model

(2)在Book模型类中应该添加objects=BookManager()来将自定义的模型方法引入。

 

posted on 2019-08-20 16:54  wyhluckydog  阅读(4334)  评论(0编辑  收藏  举报