【问题标题】:How do I call custom Django Model Manager from Class Based View?如何从基于类的视图中调用自定义 Django 模型管理器?
【发布时间】:2022-01-22 01:45:10
【问题描述】:

我想使用一个操作字段但不保存到数据库的客户模型管理器。如何在下面的示例代码中调用名为“with_counts()”的模型管理器函数。

是否可以从我的视图或模板中调用它?

    LEVEL = [
        ('Pro', 'Professional'),
        ('Int', 'Intermediate'),
        ('OK', 'Competent')
    ]

    Languages = models.CharField(max_length=25)
    Years = models.IntegerField(default=1)
    Proficiency = models.CharField(max_length=15, choices=LEVEL, default="Competent")


    def __str__(self):
        return f'{self.Languages} Level: {self.Proficiency}'


    #Do not save to data base. 
    def with_counts(self):
        return self.years * 10;

【问题讨论】:

    标签: python django django-models django-templates


    【解决方案1】:

    来自docs

    自定义的 Manager 方法可以返回您想要的任何内容。它不必返回 QuerySet。

    所以你是对的,你可以像这样在你的视图中调用它作为一个普通函数:

    views.py:

    class your_view(View):
     def get(request, *args, **kwargs):
       counts = YourModal.objects.with_counts()
       # do something with counts
    

    models.py:

    class YourModel(models.Model):
      objects = models.YourManager()
    

    managers.py:

    class YourManager(models.Manager):
     def with_counts(self):
        return self.years * 10
    

    【讨论】:

    • 这个解释很好。我现在意识到有几种方法可以做到这一点。您是否知道在基于类的视图中提供有趣的 get 方法示例的资源。我从 Django 文档中没有得到太多关于该主题的信息?
    【解决方案2】:

    只需将@property 添加到您的模型:

    @property
    def with_counts(self):
        return self.Years * 10;
    

    请参阅https://docs.djangoproject.com/en/4.0/glossary/#term-propertyhttps://docs.python.org/3/library/functions.html#property 了解更多详情。

    附:您应该使用小写的模型字段名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      • 2013-02-15
      • 2014-06-23
      相关资源
      最近更新 更多