首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我应该在什么时候在model vs model manager/ queryset中编写定制方法

在model vs model manager/ queryset中编写定制方法的时机取决于你的需求和设计目标。下面是一些常见的情况和建议:

  1. 当你需要在模型实例级别上执行特定操作时,应该在模型中编写定制方法。这些方法可以直接在模型实例上调用,并且通常用于处理该实例的特定属性或关联对象。例如,你可以在模型中编写一个方法来计算某个属性的值,或者在关联对象上执行特定的查询。
  2. 当你需要在模型集合级别上执行特定操作时,应该在模型管理器(model manager)或查询集(queryset)中编写定制方法。模型管理器是模型的一个属性,用于管理模型的数据库操作。查询集是模型管理器返回的对象,用于执行数据库查询和过滤。你可以在模型管理器或查询集中编写方法来执行特定的查询、过滤或排序操作。这些方法可以链式调用,以构建复杂的查询逻辑。
  3. 当你需要在模型实例级别和模型集合级别上执行特定操作时,可以同时在模型和模型管理器/查询集中编写定制方法。这样可以根据具体的使用场景选择合适的方法进行调用。

总之,编写定制方法的时机取决于你的需求和设计目标。在模型中编写定制方法可以使模型更加自包含和可复用,而在模型管理器/查询集中编写定制方法可以使查询和操作更加灵活和高效。根据具体情况,你可以选择在模型、模型管理器或查询集中编写定制方法,或者在多个地方同时编写。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)

模型定义一个值为models.Manager()的属性,来重命名管理器。...并不是每个查询集的方法都在管理器层面上有意义。比如 QuerySet.delete(),我们有意防止它复制到管理器 方法按照以下规则进行复制: 公共方法默认被复制。...自动管理器实例编写正确的管理器 在上面的django.contrib.gis 已经提到了, use_for_related_fields这个特性是需要返回一个自定义查询集子类的管理器中使用的。... get_queryset()方法过滤掉数据,会使得它所在的管理器不适于用做自动管理器。...你也不应该在模型中使用这个属性之后,类上改变它。这是因为模型类被创建时,这个属性值马上就会被处理,而且随后不会再读取这个属性值。

97020
  • Django的ManagerQuerySet

    实际上由于“一个模型类的实例代表数据库表的一行记录”,因此模型类的实例是不能起到查询数据的功能。 Manager 因此,我们要从数据库检索到数据,ORM就必须提供相应的方法。...Django,模型的Manager提供了接口,它赋予了 Django 模型操作数据库的能力。默认情况下,Django 为每个模型类添加了一个名为 objects 的 Manager。...要为指定类重命名 Manager该模型定义一个类型为 models.Manager 的属性。...有关如何自定义ManagerDjango管理器中有详细说明。 QuerySet 一个 QuerySet 代表来自数据库对象的一个集合。它可以有 0 个,1 个或者多个 filters。...什么时候QuerySet被执行? Django的文档,明确的告诉了开发者,什么时候QuerySet被执行。因为这影响到SQL执行效率。

    1.1K30

    详解python django面向关系数据库的ORM对象映射系统(1)

    操作的; 3、Model类只能表示“表”这个结构,同样没有办法包含所有SQL操作; 4、只有“多行”这个概念可以适配表的任意数据,也就是QuerySet容器,所以,由Model基类提供所有表操作方法是行不通的...通常,我们可以Model基类中提供一个方法或者成员,返回一个包含QuerySet方法的对象(QuerySet表示若干行,所以此时不能直接返回QuerySet),而django选择提供一个成员叫objects...,它是models.Manage类的实例,而这个Manager类虽然其定义没有SQL操作方法,但被Django框架悄悄的通过“元类”的方式,将QuerySet的所有方法都注入到Manager类中了。...BaseManager的_get_queryset_methods方法负责把QuerySet方法注入到class_dict属性,进而让BaseManagerFromQuerySet类具备了SQL操作方法...实际上,类成员中代表的是列,而代表行的Model实例是Model父类的__init__方法设置的,如下: fields_iter = iter(opts.fields) for val, field

    1.2K20

    Django项目知识点(四)

    Django ORM用到三个类:ManagerQuerySetModel。...Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法QuerySetManager类的一些方法会返回...QuerySet实例 就是从数据库根据自己要求拿数据的 连数据都那不出来,写啥视图 所以在编写queryset必须用django shell 调试 model,Django通过给Model增加一个objects...这样就可以引用模型字段值并使用它们执行数据库操作,而无需实际将它们从数据库拉出到Python内存 说白了就是从数据库拿东西,但是有些需要的字段没有,要通过绑定的外键的app的model拿。...但是名称又是app__字段来命名,这样要改名称,而且拿第一次的model,放在python内存,再拿通过外键绑定的另一个model,又要执行第一次步骤,那个效率就不行了,干嘛不一起拿,所以会用annotate

    1.6K30

    Django 分表的两个方案

    解析 Django,数据库访问的逻辑基本上是Queryset完成的,一个查询请求,比如:User.objects.filter(group_id=10)。...其中的objects其实就是models.Manager,而Manager又是对QuerySet的一个包装。...方案一 根据the5fire上面的分析,要想在执行具体查询时修改db_table已经是不可能了(当然,如果你打算去重写ModelMeta部分的逻辑以及Queryset部分的逻辑,就当我没说,只能表示佩服...不管怎么说吧,这也是个方案,更完美的方法就不继续探究了,Django的ORM钻来钻去寻找可以hook的点实在憋屈。...我们来看方案二吧 方案二 ORM的过程是这样的,Model——> SQL ——> Model方案一我们一直处理Model——> SQL的部分。其实我们可以抛开这一步,直接使用raw sql。

    3.2K20

    django优雅的实现软删除,支持Admin和DRF的软删除

    简而言之: drf找不到删除的数据,admin需要全部数据 drf和admin删除数据都是软删除 解决方案 DRF Django Manager 赋予了 Django的模型(Model)操作数据库的能力...class ModelManager(models.Manager): # 重写get_queryset方法 def get_queryset(self): # 查询出所有的数据...由于我们已经模型层通过Manager直接改变了最初的数据过滤后的样子,这里怎么重写也是无事于补的。 于是在想,那就在定义一个模型管理器,Admin中使用这个管理器不就好了?...此时问题就变得简单,Manager进阶用法,可以自定义其QuerySet^second class DeleteQuerySet(models.QuerySet): def delete(self...or objects_all = models.Manager.from_queryset(DeleteQuerySet)() 改完后admin进行删除操作: 图片 图片 OK,Admin层面上

    2.3K40

    Django源码学习-5-Manager 模型自定义-下

    Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。...ManagerQuerySetModel是django的ORM用到的三个类。 修改初始Manager QuerySets manager的基本QuerySet返回系统的所有对象。...例如,`` Book.objects.all()`` 返回数据库book的所有书本。 可以通过覆盖Manager.get_query_set()方法来重写manager的基本QuerySet。...在这个示例模型,Book.objects.all()返回了数据库的所有书本,而Book.yun_objects.all()只返回了一本....当然,由于get_query_set()返回的是一个QuerySet对象,所以可以使用filter(),exclude()和其它一切QuerySet方法

    41920

    Django学习笔记之Queryset详解

    Django ORM用到三个类:ManagerQuerySetModel。...Manager定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manager为父类,定义自己的manager,增加表级方法QuerySetManager类的一些方法会返回...manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;django.db.models模块Model类,我们定义表的model时,就是继承它,它的功能很强大...Queryset简介 每个Model都有一个默认的manager实例,名为objects,QuerySet有两种来源:通过manager方法得到、通过QuerySet方法得到。...一个QuerySet包含一个或多个model instance。QuerySet类似于Python的list,list的一些方法QuerySet也有,比如切片,遍历。

    2.7K30

    django 1.8 官方文档翻译: 2-5-6 多数据库

    数据库自动路由 使用多数据库最简单的方法是建立一个数据库路由模式。默认的路由模式确保对象’粘滞‘它们原始的数据库上(例如,从foo 数据库获取的对象将保存在同一个数据库)。...然而,如果p 的主键second数据库上已经使用second 数据库的已经存在的对象将在p保存时被覆盖。 你可以用两种方法避免这种情况。首先,你可以清除实例的主键。...db_manager()方法来让管理器访问非默认的数据库。...例如,如果你想从get_queryset 方法返回一个自定义的 QuerySet 类,你可以这样做: class MyManager(models.Manager): def get_queryset...ModelAdmin 对象具有5个方法,它们需要定制以支持多数据库: class MultiDBModelAdmin(admin.ModelAdmin): # A handy constant

    1.5K20

    Django 模型成员2.2

    ,Django应用的每个模型都拥有至少一个管理器 自定义管理器类主要用于两种情况 情况一:向管理器类添加额外的方法:见下面“创建对象”的方式二 情况二:修改管理器返回的原始查询集:重写get_queryset...()方法 class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager...,推荐使用下面的两种之式 说明: _init _方法已经基类models.Model中使用,自定义模型无法使用, 方式一:模型类增加一个类方法 class BookInfo(models.Model...管理器的方法,可以通过self.model来得到它所属的模型类 class BookInfoManager(models.Manager): def create_book(self, title...,模型的对象不存在时会引发此异常,结合try/except使用 实例的方法 str (self):重写object方法,此方法将对象转换成字符串时会被调用 save():将模型对象保存到数据表 delete

    51340

    【Django】Django ORM 学习笔记

    Manager 创建完 Model 对象之后,Django 会自动为其关联一个 Manager 对象,该对象是 Model 进行数据库操作的接口。...QuerySet 有两种来源:通过 Manager方法获取、通过 QuerySet 自身的方法获得。...Manager 的查询方法QuerySet方法大部分同名、同意(Manager的就是基于 QuerySet 的实现的),例如 filter, exclude等,但两者也有不同的方法,例如 Manager...基本查询 下面是 QuerySet (也是 Manager的)的几个基本的查询方法 all() - 获得数据库中所有实例的一个 QuerySet filter(**kwargs) - 返回满足查询条件的...: FROM 子句中插入 table 名称 order_by: order_by 子句中插入排序字段 原始 SQL 查询 使用 Manager 的 raw 方法可以用于原始的 SQL 查询,并返回

    2.2K20

    django序列化时使用外键的真实值操作

    方法序列化的是Content表,它含有一个外键关联的是Module表,1对多 要先序列化Module表,然后序列化Content表的时候才可以使用到Module的真实值 class ModuleManager...: unique_together = (('name', 'description'),) 序列化是否使用真实值: jsons = serializers.serialize(‘json’, queryset...,use_natural_foreign_keys=False) jsons = serializers.serialize(‘json’, queryset,use_natural_foreign_keys...self.module.natural_key() # 和"def"同缩进 natural_key.dependencies = ['example_app.module'] 补充知识:django原生的序列化serialize解析 写接口的时候...serialized_data = serialize('json',origin_data) return HttpResponse(serialized_data ) 当然,再有更便捷的工具的情况下,这种方法并不常用

    1.8K10

    重写django的model下的objects模型管理器方式

    django自定义管理器和model的继承 写代码时建立的很多数据库需要一些共同的字段,比如is_active, create_time这些字段,所以可以建立一个基类model 模型的继承 我们可以充分利用...class Manager(BaseManager.from_queryset(QuerySet)): ''' objects 是这个类的实例对象, 这个类我们可以看到他其实继承了 QuerySet类里的方法..., 所以我们可以直接重写个这个类方法,并重写filter方法 ''' def filter(self, *args, **kwargs): """ 我们可以看到 QuerySet里的...,我们很多地方可以用继承框架已有的类并重写类方法,是我们的代码更加pythonic 补充知识:DjangoModel的字段属性和选项 字段类型: autoField:一个根据实际ID自动增长的...不用重新生成迁移文件) 关系类型 分类: ForeignKey:一对多,将字段定义多的端 ManyToManyField:多对多,将字段定义两端 OneToOneField:一对一,将字段定义在任意一端

    1.5K40

    Django 2.1.7 模型管理器 models.Manager 以及 元选项

    参考文献 https://docs.djangoproject.com/zh-hans/2.1/topics/db/managers/ 管理器Manager 在前面的篇章,使用模型进行查询的时候,都会调用...如果想要将这个对象修改为其他名称,那么可以用models.Manager()来自定义创建对象,如下: # 全国区域信息 class AREA(models.Model): .......将某些固定的查询写到模型管理类,避免重复编写。 自定义管理器类主要用于两种情况: 1.修改原始查询集,重写all()方法 2.向管理器类添加额外的方法,如向数据库插入数据。...super().all().filter(is_delete=False) # 设置只返回未删除的数据 b)模型类MiddlewareInfo定义管理器 class MiddlewareInfo(...2.管理器类定义创建对象的方法 对模型类对应的数据表进行操作时,推荐将这些操作数据表的方法封装起来,放到模型管理器类

    96140

    Django 2.1.7 模型管理器 models.Manager 以及 元选项

    参考文献 https://docs.djangoproject.com/zh-hans/2.1/topics/db/managers/ 管理器Manager 在前面的篇章,使用模型进行查询的时候,都会调用...如果想要将这个对象修改为其他名称,那么可以用models.Manager()来自定义创建对象,如下: # 全国区域信息 class AREA(models.Model): .......将某些固定的查询写到模型管理类,避免重复编写。 自定义管理器类主要用于两种情况: 1.修改原始查询集,重写all()方法 2.向管理器类添加额外的方法,如向数据库插入数据。...super().all().filter(is_delete=False) # 设置只返回未删除的数据 b)模型类MiddlewareInfo定义管理器 class MiddlewareInfo...2.管理器类定义创建对象的方法 对模型类对应的数据表进行操作时,推荐将这些操作数据表的方法封装起来,放到模型管理器类

    56020

    Django-rest-framework过滤器的定制实例

    #其中method指向自己定义的过滤函数,label用于标识测试API界面的过滤界面字段,Filter_category控制查询字段 def category_filter(self, queryset...(category__parent__parent_id=value)|Q(category__parent__parent__parent_id=value)) class Meta: model...django_filters.rest_framework.CharFilter(method='to_bearer_service_filter', label='bearer_service') class Meta: model...= Alert fields = [......, 'to_bearer_service'] @staticmethod # 如果想获取请求信息可以去掉这个静态方法的装饰器,为什么要加静态方法装饰器也不清楚...= queryset.filter(Q_id) return queryset 以上这篇Django-rest-framework过滤器的定制实例就是小编分享给大家的全部内容了,希望能给大家一个参考

    1.7K10
    领券