首页 > 解决方案 > 在没有用户交互的情况下存储数据

问题描述

我想通过 Django 模型将网络设备数据存储Device到我的数据库中。

工作流程

  1. 主机配置需要由用户在视图中设置(主机模型
  2. 主机配置完成后,应扫描网络以查找设备(设备型号)
  3. 数据应存储在数据库中

问题:

仅当配置主机但不工作create_devices()时才允许调用该功能。if Host.objects.values():

  1. create_devices()仅当存在一个主机模型时,如何才能调用该函数?
  2. 在没有用户交互的情况下使用视图将动态和静态数据存储到数据库中是否正确?

楷模:

class Host(models.Model):
    hostname = models.CharField(default="noads", max_length=6)
    ipv4_address = models.GenericIPAddressField('IPv4')
    ipv4_subnet = models.GenericIPAddressField('IPv4')
    gateway = models.GenericIPAddressField('IPv4')

class Device(models.Model):
    hostname = models.CharField(max_length=64)
    mac_address = models.CharField(max_length=64)
    ipv4_address = models.GenericIPAddressField('IPv4')

我的观点:

from webapp.models import Host, Device
from django.views import View
from django.views.generic.detail import DetailView
import multiprocessing.dummy
import multiprocessing

def create_devices():
    """
    Creates DB entry of devices if they dont already exist

    :return: List of mulitple devices stored in objects
    :rtype: list ["Device", "Device", ...]
    """

    available_devices = get_available_devices_in_list()
    arp_table_of_all_hosts = get_arp_table_linux()
    dev_list = []
        
    for deviceip in available_devices:
        #If device already exists in DB continue
        if arp_table_of_all_hosts.get(deviceip):
            if arp_table_of_all_hosts[deviceip] in Device.objects.filter(mac_address = arp_table_of_all_hosts[deviceip]):
                continue
            else:
                devmac = arp_table_of_all_hosts[deviceip]
                devname = "unknown"         #socket.gethostbyaddr(deviceip)
                dev = Device(hostname=devname, mac_address=devmac, ipv4_address=deviceip)
                dev.save()
                dev_list.append(dev)
        
    return dev_list

class DeviceGetAll(DetailView):
    if Host.objects.values():
        create_devices()
        model = Device
    pass

标签: pythondjangodjango-modelsdjango-views

解决方案


你的观点DeviceGetAll写得不正确。if条件需要放在视图的某些方法中,而不是在类定义中。

我不明白你到底想做什么,所以我不知道你需要在哪种方法中添加代码,但你可以查看基本代码,DetailView看看其中一些方法是否对你有用。我什至不知道,详细视图是否是放置创建相同模型实例的代码的最佳位置;也许它也可以在创建主机之后进行。


但是,如果您想使用DetailView,例如,您可以覆盖get_object()来自SingleObjectMixin(它是 的父级之一DetailView)的方法,您的代码可能如下所示:

class DeviceGetAll(DetailView):
    model = Device

    def get_object(self, *args, **kwargs):
        if Host.objects.exists():
            create_devices()

        obj = super().get_object(*args, **kwargs)
        return obj

此外,您可能的意思是.exists()在 if-condition 中使用该方法而不是.values().


推荐阅读