基于json url请求和唯一值的Django模型更新

2024-09-30 22:17:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我制作了一个从url请求json的方法,从我的ImagemServer()Django模型中填充我的objectidServer字段,然后从中获取一些值。主要目的是在每次json更新时填充新字段。例如:如果有人出于任何原因从该字段中删除一个值,该方法将根据ObjectdServer值再次请求并填充该字段(如果存在相同的值,则不执行任何操作,如果不存在,则创建)。同样,每次json更新都会获取新值并填充新字段

models.py

class ImagemServer(models.Model):
    objectidServer = models.CharField(max_length=255, null=True, blank=True)
    name = models.CharField(max_length=255, null=True, blank=True)
    tx_sensor = models.CharField(max_length=255, null=True, blank=True)
    nr_ano = models.CharField(max_length=255, null=True, blank=True)

views.py

def GIS(request): 
    response = requests.get('url')
    geodata = response.json()

    id_obj = [(data['attributes']['OBJECTID']) for data in geodata['features']]

    try:
        for lista in id_obj:
            ImagemServer.objects.get(objectidServer=lista)
        return HttpResponse('OK')

    except ImagemServer.DoesNotExist:
        for lista2 in id_obj:
            imagemServer_list = ImagemServer()
            obj = ImagemServer(objectidServer=lista2)
            #print(lista2)
            #print(imagemServer_list.objectidServer)
            if imagemServer_list.objectidServer != lista2:
                for lista3 in id_obj:
                    print(lista3)
                    obj = None
                    obj = ImagemServer()
                    obj.objectidServer = lista3
                    obj.save()
                return HttpResponse("UPDATED")
            else:
                return HttpResponse("OK")

json example

"features": [
  {
   "attributes": {
    "OBJECTID": 1,
    "Name": "1324_150612",
    "MinPS": 0,
    "MaxPS": 2.245788210298803e-005,
    "LowPS": 2.2457882102988031e-006,
    "HighPS": 2.2457882102988031e-006,
    "Category": 1,
    "Tag": "Dataset",
    "GroupName": "",
    "ProductName": "",
    "CenterX": -56.584631153437641,
    "CenterY": -17.062917718639063,
    "ZOrder": null,
    "NR_ANO": 2014,
    "TX_SENSOR": "TEST",
   }
}]

脚本运行良好,我可以填充所有字段,但当我删除任何字段时,我遇到了一个问题:当我再次请求json时,该方法不会检查值是否存在,并再次填充所有内容,复制条目。当nothings被删除时,即使json也不会更新。真的不知道我错过了什么

Relations

objectidServer (Model) -> OBJECTID (json)
name (Model) -> Name (json)
tx_sensor (Model) -> TX_SENSOR (json)
nr_ano (Model) -> NR_ANO (json)

Tags: inidjsontrueobjformodelmodels
1条回答
网友
1楼 · 发布于 2024-09-30 22:17:21

我认为您的脚本有点复杂,您的try/except和多个循环并不总是像您预期的那样运行。例如,一旦在try部件中找不到第一个对象,您就开始在except部件中进行新的循环

我建议采取另一种方法:

步骤1:删除所有不再存在的对象

步骤2:添加缺少的对象

这可能是这样的:

def GIS(request): 
    response = requests.get('url')
    geodata = response.json()

    id_obj = [(data['attributes']['OBJECTID']) for data in geodata['features']]

    # Delete objects not existing any more
    deleted = ImagemServer.objects.exclude(objectidServer__in=id_obj).delete()
    res = list(ImagemServer.objects.values_list('objectidServer', flat=True))

    # Add new objects
    new_ids_list = [x for x in id_obj if x not in res]
    new_servers = [ImagemServer(objectidServer=x) for x in new_ids_list]
    ImagemServer.objects.bulk_create(new_servers)

    if deleted or new_ids_list:
        return HttpResponse('Updated')
    else:
        return HttpResponse('OK')

相关问题 更多 >