循环获取模型字段,基于API返回值创建新的模型实例

时间:2019-05-12 03:24:17

标签: python-3.x loops django-models primary-key

我正在使用几个不同的API调用来填充(创建或更新)特定模型的字段。不必为每个API调用创建一系列新的create_or_update字段,而是尝试制作一个循环以摆脱样板代码。有一点需要注意的是,api返回的某些字段与python保留关键字(例如id,type)重叠。在循环比较期间,我需要能够挑选出这些并在字典中重命名它们。

  1. 查找模型并获取其字段,创建这些字段的列表,例如:
['id', 'organizationId', 'name', ... ]
  1. 在API响应中循环,并为每个响应对象创建一个key:values字典。如果在字典中找到列表值,则将key:value设置为在API响应中找到的值,否则,请将字段的值设置为None。
{ 'id': 'N_543265', 'organizationId': '43675', *name field missing* , ...}

由于同时找到了'id'和'organizationId',我希望将其值更新到Model实例中,但是由于未找到'name',因此我希望将其跳过

我遇到的主要问题是,当它运行时(这是一个芹菜任务),它告诉我以下内容:

  

database.models.Network.DoesNotExist:网络匹配查询不存在。

models.py

class Device(models.Model):
    networkId = models.ForeignKey(Network, on_delete=models.CASCADE, blank=True, null=True, related_name='network_device')

    name = models.CharField(max_length=100, default='', blank=True, null=True)
organizationId = models.CharField(max_length=100, default='', blank=True)

devices_status.py

...**API call happens here**

    result = response.text
    job = json.loads(result)

    l = []
    s = []
    x = Device._meta.get_fields()
    for f in x:
        fields = []
        try:
            l.append(str(f).split('.'))

            for a in l:
                s.append(a[-1])

            for q in s:
                if '<' in q:
                    continue
                elif '>' in q:
                    continue
                else:
                    fields.append(q)
        except AttributeError as e:
            print(e)
            pass

    for line in job:
        d = {}
        for k, v in line.items():
            if k in fields:
                d[k] = v
            else:
                continue

        # Have to delete this from the auto field pull otherwise it gets 
        # confused with python factory vars
        try:
            del d['type']
        except KeyError as e:
            print('Delete type: {}'.format(e))
            pass

        try:
            Device.objects.update_or_create(
                networkId = Network.objects.get(networkId=d['networkId']),
                name = d['name'],
                serial = d['organizationId'],

                defaults = d
            )
        except KeyError as e:
            print(e)
            pass

    return result

基本上,我希望基于比较API中返回的字段来填充模型实例,以避免引发KeyError,并且没有一堆try / except来手动找出可能存在或可能不存在的字段。 API数据。

即使我对问题的处理方式更高级,任何帮助也都很好。我认为,如果我可以使其正常运行,那么很多人都可以从中受益。

0 个答案:

没有答案