在没有用户交互的情况下存储数据

2024-10-01 00:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过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

Tags: ofindevimportifaddressmodelsdevice
1条回答
网友
1楼 · 发布于 2024-10-01 00:15:47

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

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


但是如果您想使用DetailView,您可以从SingleObjectMixin(它是DetailView的父级之一)重写方法get_object(),您的代码可以如下所示:

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

另外,您可能想在if条件中使用^{}方法,而不是.values()

相关问题 更多 >