我从以下字典的一些网络服务列表中得到:

{
    '_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()

但是找不到将嵌套/复杂 dict 放入我的模型对象的方法。
当我尝试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.

我的模型有什么问题?

#1楼 票数:1

Django 不会自动处理相关模型实例的构建。 你需要自己解决这个问题。

在你的情况下,我会做以下事情。

# Assume "data" holds your data structure

stats_data = data.pop('stats')
os_data = data.pop('os')  # Clashes with os module - please don't
sysinfo_data = data.pop('sysinfo')

# store the FK in data
data['stats'] = stats(**stats_data)
data['os'] = os(**os_data)
data['sysinfo'] = sysinfo(**sysinfo_data)

host_instance = Host(**data)

我还建议使用原子事务上下文管理器,因此如果在构建 Host 实例期间出现问题,您将不会留下任何数据。

from django.db import transaction


with transaction.atomic():

    # Code from above

为了进一步提高代码的可读性,您应该遵循 PEP8 和 Django 代码指南。 这也使帮助您变得更加容易,否则人们可能会对模型、方法等是什么感到困惑。 https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/#model-style

例如:Modelnames 应该是CamelCase

#2楼 票数:0

我可以建议您创建一个新的模型类,例如:StatsItem

即:

class StatsItem:
def __init__(self, data):
    self.acqs = data.get("acqs")
    self.alerts = data.get("alerts")
    ..
    ..
    self.blocks = data.get("blocks")

然后将json文件提供给构造函数:

stats = StatsItem(data.get('stats'))

现在你有了 stats 变量,你可以很容易地达到每个值:

blocks_value = stats.blocks

如果您在 StatsItem 内部创建一个函数(我称之为 request_data):

def to_request_data(self):
    return dict(
        acqs=self.acqs if self.acqs else None,
        alerts=self.alerts,
        ..
        ..
        blocks=self.blocks
    )

这样你就可以返回 dict 这也很容易访问:

data = stats.requested_data() ## stats is the variable that we initialize above.
blocks = data.get('blocks')

希望有帮助,

  ask by ŁukaszD translate from so

未解决问题?本站智能推荐:

2回复

Django 模型 - 循环导入问题

我的 Django 项目使用三个应用程序, chat, user, sowi 。 每个应用程序都具有以下方式构建的模型。 启动服务器时出现错误,我认为这是因为我有循环导入。 我该如何解决这个问题? 聊天/模型.py 用户/模型.py sowi/models.py 错误信息: 提前
3回复

在Django的settings.py中导入模型

我正在尝试使用settings.py的model类的值定义一个常量,为我的一个模型提供动态定义的FK: 毫不奇怪,它导致AppRegistryNotReady异常: 因为没有调用django.setup()方法。 如果我加 在模型的导入前面,而不是AppRegist
1回复

如何在单独的类中导入 Django 模型

我正在使用信号进行后处理数据。 因为有很多事情需要发生,后来我想在后台运行该逻辑,这样用户就不必等待,我想在单独的类中运行此代码。 我想在我的 Post Save 事件中运行代码 但我收到以下错误: 该模型肯定存在于我的 models.py 文件中 我在这里缺少什么?
1回复

Django从嵌套的json向模型中添加数据返回TypeError:'NoneType'对象不可下标

我正在使用第三方 API 来获取数据并通过objects.update_or_create()方法将其添加到我的数据库中。 此数据有许多记录,并且响应中的某些字段仅存在于某些记录中。 下面是从 API 返回的 JSON 片段。 但是,此数据仅适用于 JSON 响应中的某些记录。 当我尝试将此数据添
1回复

Django:模块未找到错误,导入模型时

我是 Django 的新手,在我的项目中,我创建了 2 个应用程序、Web 和仪表板,同时尝试使用 '''from myproject.web import models''' 从 Web 导入我的模型到应用程序仪表板中的模型我是收到以下错误:ModuleNotFoundError:没有名为“myp
1回复

Django:从另一个模型对象动态生成 ChoiceField 值

我想用动态生成的 ChoiceField 选项实现一个 Django 表单。 在我的 views.py 中,我定义了以下(相关)方法:
1回复

如何反序列化Django模型对象?

我是python的新手,并且正在从Java过渡,因此我将使用Java术语,因为我需要知道它的等效python版本。 所以我有一个Django模型,如下所述: 我也有一个卡夫卡经纪人来处理这些订单。 要将它们推送到kafka队列中,我将它们转换为JSON对象,如下所示: 现
1回复

选择外键对象后保存 Django 模型表单并刷新

我有以下型号: 添加新的 InputTest 对象时,管理员会从现有对象中选择一个 PicID 对象(外键)。 我想在选择它后立即保存和刷新对象。 例如: 添加新的InputTest对象时,我选择PIC#1作为外键。 程序将运行这个被覆盖的方法: 然后当页面刷新时,image_fie