我正在使用几个不同的API调用来填充(创建或更新)特定模型的字段。不必为每个API调用创建一系列新的create_or_update字段,而是尝试制作一个循环以摆脱样板代码。有一点需要注意的是,api返回的某些字段与python保留关键字(例如id,type)重叠。在循环比较期间,我需要能够挑选出这些并在字典中重命名它们。
['id', 'organizationId', 'name', ... ]
{ '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数据。
即使我对问题的处理方式更高级,任何帮助也都很好。我认为,如果我可以使其正常运行,那么很多人都可以从中受益。