【问题标题】:Nested serialization for JSONJSON的嵌套序列化
【发布时间】:2019-12-28 21:56:36
【问题描述】:

我正在尝试在成功发布请求后返回这样的 JSON。

{
    "ip": "127.0.0.1",
    "ports": [
        {port: "", service: ""}
    ],
    "first_scan": "date",
    "last_updated": "date"
}

我正在尝试制作我的序列化程序,以便每当我的 nmap 函数在控制台上以这种方式返回数据时:

Host : 127.0.0.1 (localhost) State : up
port : 631      service : CUPS
port : 902      service : VMware Authentication Daemon
port : 6463     service : 
port : 8000     service : WSGIServer/0.2 CPython/3.7.3

它会像提到的 JSON 那样解析它。

我曾尝试在我的models.py 中制作这样的模型

class nmapScan(models.Model):
    ip = models.CharField(max_length=13, blank=True)
    ports = models.CharField(max_length=5)
    service = models.TextField()
    first_scan = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['first_scan']

但我仍然对这种嵌套序列化概念感到困惑。我将如何继续从我的函数中解析数据,像特定的 JSON 一样返回它并将其正确存储在数据库中(假设我的模型是正确的)?

【问题讨论】:

  • 程序中什么样的对象保存着这些数据?字典?

标签: python json django python-3.x


【解决方案1】:

根据你的数据库,你可以使用这样的东西:

class nmapScan(models.Model):
    ip = models.CharField(max_length=13, blank=True)
    services = JSONField()              # [{"service": "", "port": ""}, ... ]
    first_scan = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['first_scan']

#####################

scan = nmapScan.objects.get(...)
for service in scan.services:
    service['port']
    service['name']

或者

class nmapScan(models.Model):
    ip = models.CharField(max_length=13, blank=True)

    first_scan = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['first_scan']


class Service(models.Model):
    port = models.CharField(max_length=5)
    name = models.TextField()              # service name
    scan = ForeignKey(nmapScan, related_name='services')

#####################

scan = nmapScan.objects.get(...)
for service in scan.services.all():
    service.port
    service.name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    相关资源
    最近更新 更多