视图或模型管理器DJANGO上的查询集

时间:2020-06-05 06:23:56

标签: python django python-3.x django-models django-views

几天前,有个人向我解释说,在ruby on rails上,查询是在模型上完成的。因为它已保存到您的数据中,然后再请求视图和查询。

通过我已经学习并一直工作到现在的方式,我在views.py上设置查询并通过上下文变量进行传递。因此,我开始阅读有关Model.Manager的文章,但仍然找不到哪种方法更好的答案:

  1. 对视图的查询
  2. 通过简单功能对模型进行查询
  3. 在每个模型的model.Manager类上进行的查询

4 个答案:

答案 0 :(得分:1)

每个模型都与一个Manager关联(默认值是objects

>>> from django.contrib.auth.models import User
>>> user = User.objects.all()
>>> type(user)
<class 'django.db.models.query.QuerySet'>

当您需要对模型进行任何查询时,您需要一位经理。在上面的示例中,用户对objects用户模型管理者进行了查询。

3-queries made on models.Manager class for each model-正确的解释

答案 1 :(得分:1)

Click here for Documentation

Ref.

默认情况下,Django将带有名称对象的Manager添加到每个Django模型类中。 如果您有特定的业务逻辑,则可以利用管理器来覆盖诸如save()和delete()之类的内置模型方法,以将业务逻辑添加到默认数据库行为中,或者可以专门设计一些查询逻辑。

文件名----> models.py

from .managers import ModelNameManager

class ModelName(Base):
      title = models.CharField(max_length=255, blank=True, null=True)
      headline = models.CharField(max_length=255, blank=True, null=True)


      objects = ModelNameManager()

在应用程序中创建文件manager.py文件 文件名----> manager.py

class ModelNameQuerySet(models.QuerySet):
    def by_name(self, id):
        return self.filter(id=id)

class ModelNameManager(models.Manager):
    def get_queryset(self):
        return ModelNameQuerySet(self.model, using=self._db)

    def by_name(self, ad):
        return self.get_queryset().by_name(id)

在Views.py或您要查询的任何服务文件中

     import ModelName
     obj = ModelName.get_queryset(id)
     obj.title

这将基于在管理器中编写的查询返回对象。

我希望这会有所帮助。

答案 2 :(得分:1)

  1. 在模型中使用自定义QuerySet和ModelManagers
  2. 从视图中调用模型的ModelManager自定义方法
  3. 将返回的值(查询集,实例或其他内容)传递到模板(或JSON序列化程序等)

这是关注点分离的问题:

  1. 模板(或json序列化程序或其他)不必知道数据来自何处,也不必获取数据-只需知道数据结构是什么
  2. 视图不必了解如何实现查询,而仅需了解如何获取相关数据
  3. 只有模型层应该知道其实现方式(封装101)

答案 3 :(得分:1)

根据Django习惯用法,希望添加一些有用的建议:

  • 模型管理器,这里是大多数常见查询而非所有查询的地方。经理们描述了使用模型的基本方法。如果您对带有queryset的模型具有广泛使用的逻辑,则将其放入管理器的方法中。例如,我的用户按域划分,因此我想按名称和域来获取用户,因此将error MSB3644: The reference assemblies for MonoAndroid,Version=v1.0 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. 方法添加到用户模型管理器中。另外,您可以通过管理器中的get_by_name_and_domain属性访问模型。
  • 模型是Django上MTV(模型-视图-模板)模型的一部分,“模型”本身的主要目的是描述数据库对象,而不是相关的业务逻辑。因此,将您的自定义查询放在视图中,并记住有关DRY原理的信息。