Python 在queryset上运行的Django模型
我是Django新手,对Python也有点陌生。我试图找到一种惯用的方法来循环查询集,并在每个模型上设置一个变量。基本上,我的模型依赖于api中的一个值,模型方法必须将它的属性之一乘以这个api值,才能得到最新的正确值 目前,我是在视图中这样做的,它是有效的,但我不确定这是实现我想要的目标的正确方法。我必须在别处复制这种循环 有没有一种方法可以将循环逻辑封装到queryset方法中,以便可以在多个位置使用它 注意:我在每个模型实例上设置的变量只是一个常规属性,而不是保存到db。我只需要能够设置那个变量,而不是保存它 我有这个atm(我使用的是django rest框架): 我认为这样做会更好: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。我只需要能够设置那
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')