【问题标题】:Have custom manager but keep objects keyword available有自定义管理器但保持对象关键字可用
【发布时间】:2015-05-14 03:55:43
【问题描述】:

我正在学习 Python + Django(基本上爱上了 - 之前是 100% .NET 的人),并且我正在尝试学习管理器的概念。

我正在尝试添加一个名为 ProviderManager 的自定义管理器,它将根据某些输入获取一些对象。

但是,我仍然希望能够说出类似的话:

city= City.objects.filter(id = city_id).first()

在我的views.py 文件中。

我明白当我添加一个新的自定义管理器时,它会覆盖 objects 关键字。

但是,我的问题是:我如何既拥有可用的对象,又拥有我的新提供者方法,所以我可以说City.provider.get_provider()

当前代码:

class ProviderManager(models.Manager):

    def get_provider(country, city=0):
        return "abekat"


class City(models.Model):
    title = models.CharField(max_length=200)
    country = models.ForeignKey(Country, null=True)
    is_visible = models.BooleanField(default=False)
    providers = ProviderManager()

    def __str__(self):
        return self.title

Views.py:

def city(request, country_id, city_id):
    country= Country.objects.filter(id = country_id).first()
    city= City.objects.filter(id = city_id).first()
    print city

    data = {
            'country': country.title,
            'city': city.title,
            'provider': 'abe',
        }

    return render(request, 'city.html', data)

【问题讨论】:

    标签: python django django-1.8


    【解决方案1】:

    Managers 为表范围的操作提供方法(指的是它们被添加到的模型的表)。 因此,如果您想为您的 City 模型编写一个经理,最好将其命名为 CityManager。

    由于自定义管理器继承自 models.Manager,您可以覆盖模型类中的对象名称。这不会改变标准对象管理器的行为,但您的自定义方法也将在对象名称下可用。

    有关详细信息,请参阅文档: https://docs.djangoproject.com/en/1.8/topics/db/managers/#custom-managers

    请注意 Managers 和 Model 方法之间的区别,后者用于文档中解释的“行级”功能。

    【讨论】:

      猜你喜欢
      • 2013-04-24
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多