ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## Model Manager 模型之间关系控制的核心一环,默认情况下所有模型都有一个叫objects的管理器,但是你可以自己继承models.Manager然后添加或者覆盖方法 ~~~py 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) publication_date = models.DateField() num_pages = models.IntegerField(blank=True, null=True) objects = BookManager() def __str__(self): return self.title Here are some notes about the code: ~~~ 上面这样相当于给默认的objects添加了一个叫title_count的方法 当然我们也可以添加一个新的Manager给模型 <br> ~~~py # First, define the Manager subclass. class DahlBookManager(models.Manager): def get_queryset(self): return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl') # Then hook it into the Book model explicitly. class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=50) # ... objects = models.Manager() # The default manager. dahl_objects = DahlBookManager() # The Dahl-specific manager. ~~~ 上面这种做法使得Book拥有了两个Manager,DahlBookManager覆盖了父类的get_queryset方法,同时需要注意的是如果有自定义的Manager赋值,则默认的Manager也必须显式赋值才行 常用的Manager类供子类覆盖的方法有 ~~~py get_queryset: 此方法可以用来添加额外的限制条件使得自定义的manager在任何数据库查询时自动加入这个方法中已经添加的 筛选条件 ~~~ **** ### 多数据库情境下的操作 django的orm是可以在一个项目中操作多个数据库的,这里不讲具体的配置问题,只讲如何在使用orm语句时进行多个数据库的操作 ~~~py # 查询 YourModel.objects.using('db1').all() 或者 YourModel.objects.using('db2').all() # 保存 或 删除 user_obj.save(using='new_users') user_obj.delete(using='legacy_users') ~~~ 奏是这么简单,查询时使用using函数,增删改时使用using参数来指定数据库名称就行了 参考文章: 1. [自强学堂:django多数据库联用](https://code.ziqiangxuetang.com/django/django-multi-database.html)