Django:将API数据保存到模型

pbpqsu0x  于 2023-04-22  发布在  Go
关注(0)|答案(3)|浏览(132)

Django / python相对较新。我有一个API调用请求,并从中获得JSON数据:
['node':'node01',' cpu':0.0193098516002146,'mem':92328939520,'状态':'online'},' node ':'node02',' cpu':0.0100098516002146,'mem':72823919520,'状态':'online'},' node ':'node03',' cpu':0.0023498516002146,'mem':92328939520,'状态':'online'}]
如果我把i变得更容易理解:
['node':'node01',' cpu':0.0193098516002146,'mem':92328939520,'状态':'online'},' node ':'node02',' cpu':0.0100098516002146,'mem':72823919520,'状态':'online'},' node ':'node03',' cpu':0.0023498516002146,'mem':92328939520,'状态':'online'}]
我有以下模型:

class Node(models.Model):
        node = models.CharField(max_length=2000, null=True, blank=True)
        cpu = models.FloatField(null=True, blank=True)
        mem = models.FloatField(null=True, blank=True)
        status = models.CharField(max_length=2000, null=True, blank=True)

现在我想将API数据保存到模型中,因此在本例中,DB中有3个“记录”。
我尝试了以下方法:

for node in r:
        a = Node(
            cpu=node['cpu'],
            mem=node['mem'],
            node=node['node'],
            status=node['status'],
            )
        a.save()

r是API调用数据。但这只保存最后一个API数据(node 03)。当我再次调用API时,记录必须更新(以反映mem更改等)

mftmpeh8

mftmpeh81#

最好使用bulk_create而不是loop。试试这个:

obj_create_list = []
for node in r:
    obj_create_list.append(
       Node(
            cpu=node['cpu'],
            mem=node['mem'],
            node=node['node'],
            status=node['status'],
            )
    )
if obj_create_list:
   Node.objects.bulk_create(obj_create_list)
5kgi1eie

5kgi1eie2#

试试下面的东西--
型号

class BarList(models.Model):
     api_id = models.CharField(max_length=100, null=False)
     user = models.ForeignKey(User,on_delete=models.CASCADE,null=True,related_name="user")

观点

def add_list(request,results):
    if request.method == 'POST':
        Bar = BarList(api_id=results,user=request.user)
        Bar.save()
        return HttpResponseRedirect('/')
    else:
        return render(request, 'API/results.html')
tzdcorbm

tzdcorbm3#

我认为这里的问题不是它在DB中创建了3条记录。因为您共享的代码将在数据库中创建三个条目,但变量a只会跟踪它创建的最后一个示例。但如果您这样检查:

for node in r:
    a = Node(
        cpu=node['cpu'],
        mem=node['mem'],
        node=node['node'],
        status=node['status'],
        )
    a.save()
    print(a)

它应该打印它创建的所有示例。
除此之外,@HemalPatel建议的是正确的apraoch。您应该使用bulk_create。此外,bulk_create有用于更新假定更新的示例的选项(如this answer中所解释的)。
尽管如此,我还是建议你跟踪特定节点的所有更改,并且你总是可以获得最新的更改。例如使用Window函数:

from django.db.models import F, Window
from django.db.models.functions import LastValue

nodes= Node.objects.annotate(
    latest_cpu=Window(
        expression=LastValue('cpu'),
        partition_by=['node']
    )
)

nodes.values('node', 'latest_cpu')

相关问题