Я получил из списка сетевых служб следующую команду:
{
'_id': 'bcEsX4Mhridf7Fdz59nYcm',
'stats': {
'acqs': 0,
'alerts': 0,
'blocks': 0,
'false_positive_alerts': 0,
'false_positive_alerts_by_source': {},
'malware_false_positive_alerts': 0
},
'hostname': 'SomePC',
'domain': 'local',
'url': '/hx/api/v3/hosts/bcEsX4Mhridf7Fdz59nYcm',
'sysinfo': {
'url': '/hx/api/v3/hosts/bcEsX4Mhridf7Fdz59nYcm/sysinfo'
},
'os': {
'product_name': 'Windows 10 Pro',
'patch_level': None,
'bitness': '64-bit',
'platform': 'win',
'kernel_version': None
},
}
Я хочу импортировать ее в django объект модели. Мой models.py содержит следующий код:
class Host(models.Model):
_id = models.CharField(max_length=25, primary_key=True)
hostname = models.CharField(max_length=25)
domain = models.CharField(max_length=253)
url = models.CharField(max_length=50)
def __str__(self):
"""String for representing the Model object."""
return '{0}_({1})'.format(self.hostname, self._id)
class stats(models.Model):
host = models.OneToOneField(Host, on_delete=models.CASCADE, null=True)
acqs = models.IntegerField(default=0)
alerts = models.IntegerField(default=0)
blocks = models.IntegerField(default=0)
false_positive_alerts = models.IntegerField(default=0)
malware_false_positive_alerts = models.IntegerField(default=0)
def __str__(self):
"""String for representing the Model object."""
return '{0}/{1}/{2}'.format(
self.acqs,
self.alerts,
self.blocks
)
class sysinfo(models.Model):
host = models.OneToOneField(Host, on_delete=models.CASCADE, null=True)
url = models.CharField(max_length=45, blank=True)
def __str__(self):
"""String for representing the Model object."""
return '{0}'.format(self.url)
class os(models.Model):
host = models.OneToOneField(Host, on_delete=models.CASCADE, null=True)
product_name = models.CharField(max_length=253)
patch_level = models.CharField(max_length=253, blank=True, null=True)
bitness = models.CharField(max_length=10, blank=True, null=True)
platform = models.CharField(max_length=10, blank=True, null=True)
kernel_version = models.CharField(max_length=10, blank=True, null=True)
def __str__(self):
"""String for representing the Model object."""
return '{0}'.format(self.product_name)
Если упомянутый dict будет плоским, я могу импортировать его в объект модели следующим кодом:
h = Host(**my_dict)
h.save()
Но не могу найти путь поставить вложенный / сложный диктат моим модельным объектам.
Когда я пытаюсь h = Host(**my_dict)
я получаю сообщение об ошибке:
ValueError Traceback (most recent call last)
<ipython-input-37-1250f570aeb3> in <module>
----> 1 h_new2 = Host(**my_dict2)
C:\Program Files\Python37\lib\site-packages\django\db\models\base.py in __init__(self, *args, **kwargs)
493 if prop in property_names or opts.get_field(prop):
494 if kwargs[prop] is not _DEFERRED:
--> 495 _setattr(self, prop, kwargs[prop])
496 del kwargs[prop]
497 except (AttributeError, FieldDoesNotExist):
C:\Program Files\Python37\lib\site-packages\django\db\models\fields\related_descriptors.py in __set__(self, instance, value)
462 instance._meta.object_name,
463 self.related.get_accessor_name(),
--> 464 self.related.related_model._meta.object_name,
465 )
466 )
ValueError: Cannot assign "{'url': '/hx/api/v3/hosts/po1qmpQ2L3jdwQKKWS1CJm/sysinfo'}": "Host.sysinfo" must be a "sysinfo" instance.
Что не так с моими моделями?