在Django中实现透视

在Django中实现透视,django,Django,我想要一个Django视图来查询模型,如果没有找到任何东西,就使用一个对象来尝试从internet获取信息 我想做的是这样的: def my_view(request, foo): try: bar = ModelClass.objects.get(property=foo) except Question.DoesNotExist: bar = api_object.get(foo) 我想避免的是: def my_view(request, f

我想要一个Django视图来查询模型,如果没有找到任何东西,就使用一个对象来尝试从internet获取信息

我想做的是这样的:

def my_view(request, foo):
    try:
        bar = ModelClass.objects.get(property=foo)
    except Question.DoesNotExist:
        bar = api_object.get(foo)
我想避免的是:

def my_view(request, foo):
    try:
        bar = ModelClass.objects.get(property=foo)
    except Question.DoesNotExist:
        api_object = ApiObject()
        bar = api_object.get(foo)

如何做到这一点,使我不必每次都构造
api\u对象

Django惯用的方法是通过定制。所以我会这样做

class MyManager(models.Manager):
    def get_or_fetch(self, property):
        queryset = self.get_queryset()
        try:
            return queryset.model.get(property=property)
        except queryset.model.DoesNotExist:
            return api_object.get(property)

class ModelClass(models.Model):
    objects = MyManager()


# in your view
bar = ModelClass.objects.get_or_fetch(property=foo)

Django惯用的方法是通过定制。所以我会这样做

class MyManager(models.Manager):
    def get_or_fetch(self, property):
        queryset = self.get_queryset()
        try:
            return queryset.model.get(property=property)
        except queryset.model.DoesNotExist:
            return api_object.get(property)

class ModelClass(models.Model):
    objects = MyManager()


# in your view
bar = ModelClass.objects.get_or_fetch(property=foo)

对不起,也许问题不清楚。我如何做到这一点,使
api\u对象
在启动时只创建一次,然后只存在于我的视图/管理器的名称空间中?我想我可以通过将
api\u对象
设置为
MyManager
的属性来解决这个问题。@Batman这很有效。您还可以将其放入Django在开始时加载的任何文件中。诚实取决于你的品味,但让它成为经理的财产是公平的。对不起,也许问题不清楚。我如何做到这一点,使
api\u对象
在启动时只创建一次,然后只存在于我的视图/管理器的名称空间中?我想我可以通过将
api\u对象
设置为
MyManager
的属性来解决这个问题。@Batman这很有效。您还可以将其放入Django在开始时加载的任何文件中。诚实取决于你的品味,但让它成为经理的财产是公平的。