Python 在queryset上运行的Django模型

Python 在queryset上运行的Django模型,python,django,model-view-controller,django-models,django-rest-framework,Python,Django,Model View Controller,Django Models,Django Rest Framework,我是Django新手,对Python也有点陌生。我试图找到一种惯用的方法来循环查询集,并在每个模型上设置一个变量。基本上,我的模型依赖于api中的一个值,模型方法必须将它的属性之一乘以这个api值,才能得到最新的正确值 目前,我是在视图中这样做的,它是有效的,但我不确定这是实现我想要的目标的正确方法。我必须在别处复制这种循环 有没有一种方法可以将循环逻辑封装到queryset方法中,以便可以在多个位置使用它 注意:我在每个模型实例上设置的变量只是一个常规属性,而不是保存到db。我只需要能够设置那

我是Django新手,对Python也有点陌生。我试图找到一种惯用的方法来循环查询集,并在每个模型上设置一个变量。基本上,我的模型依赖于api中的一个值,模型方法必须将它的属性之一乘以这个api值,才能得到最新的正确值

目前,我是在视图中这样做的,它是有效的,但我不确定这是实现我想要的目标的正确方法。我必须在别处复制这种循环

有没有一种方法可以将循环逻辑封装到queryset方法中,以便可以在多个位置使用它

注意:我在每个模型实例上设置的变量只是一个常规属性,而不是保存到db。我只需要能够设置那个变量,而不是保存它

我有这个atm(我使用的是django rest框架):

我认为这样做会更好:

def get_queryset(self):
    bar = # some call to an api
    # Dynamically set the bar variable on each instance!
    return Foo.objects.filter(baz__pk=1).order_by('date').set_bar(bar)
我认为api命中应该在控制器中,然后注入到模型的实例中,但我不确定如何做到这一点。我一直在调查QuerySet和经理们,但仍然无法确定这是否是实现我想要的最好的方法

有人能建议用django建立模型的正确方法吗


谢谢。

您可以在queryset项上设置一些新属性,但它们不会更新数据库(将仅保存在本地命名空间中)。我假设您想重新计算模型的字段乘以某个值:

class Foo(models.Model):
     calculated_field = models.BigIntegerField(default=0)

def save(self, *args, **kwargs):
    if self.pk is not None:  # it's not a new record
       foo = kwargs.get('foo')
       if foo:
           self.calculated_field = self.calculated_field * int(foo)
    super(Foo, self).save(*args, **kwargs) # Call the "real" save() method.


 def get_queryset(self):
        bar = # some call to an api
        # Dynamically set the bar variable on each instance!
        foos = Foo.objects.filter(baz__pk=1).order_by('date')
        for item in foos:
            item.save(foo=bar)
       # return updated data
       return Foo.objects.filter(baz__pk=1).order_by('date')

如果要同时运行此代码,有时可能需要使用事务。

可能的重复不是重复,至少不是该问题的重复。OP希望更新模型的内存实例,而不是数据库记录。我刚刚在建议的dupe中测试了解决方案,但它不起作用:
项没有名为“btc_usd”的字段。
该字段只是一个属性,不保存到db。由于python是ducky类型,您已经做对了。只要need_bar不是一个现有属性,在视图中这样做没有错,但是如果你发现自己在重复它,你可以将它封装在一个独立的函数中。我不会将其作为任何类的方法,除非它实际上依赖于该类来确定
值。抱歉,忘记添加字段只是模型上的am属性-它不会保存到数据库中。我假设
更新
命中了我不需要的db。我只需要在方法中使用的每个模型上设置一个变量。@nickzam-“你不能只在queryset项上设置一些新属性”。当然可以,它们和其他对象一样,只是Python对象。新属性不会保存到数据库中,但在内存中向它们添加任意值就可以了。@Peter DeGlopper-谢谢,你说得对。编辑了我的答案
class Foo(models.Model):
     calculated_field = models.BigIntegerField(default=0)

def save(self, *args, **kwargs):
    if self.pk is not None:  # it's not a new record
       foo = kwargs.get('foo')
       if foo:
           self.calculated_field = self.calculated_field * int(foo)
    super(Foo, self).save(*args, **kwargs) # Call the "real" save() method.


 def get_queryset(self):
        bar = # some call to an api
        # Dynamically set the bar variable on each instance!
        foos = Foo.objects.filter(baz__pk=1).order_by('date')
        for item in foos:
            item.save(foo=bar)
       # return updated data
       return Foo.objects.filter(baz__pk=1).order_by('date')