【问题标题】:Store data without Userinteraction在没有用户交互的情况下存储数据
【发布时间】:2021-12-03 11:52:48
【问题描述】:

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

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

    您的视图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 条件中使用 .exists() 方法而不是 .values()

    【讨论】:

    • 坦克很多!真丢脸,exists() 是我需要的。那么可以在视图中扫描网络,将其写入数据库,并创建同一类中所有设备的详细视图吗?还是有更方便的方法?
    • @kadopsdong 如果您需要在一个主机存在时立即创建设备,那么我建议将该代码添加到Host 模型的CreateView.form_valid() 中。
    • 完美:) 但是没有办法扫描网络 asnyc 对吗?唯一的操作是使用 Threadpool 快速完成。
    • @kadopsdong 如果你想要异步,你可以查看Celerydjango-background-tasks
    • 您好,很遗憾,删除数据库后出现同样的问题...当我使用存在时,它会引发错误,因为没有主机设置。
    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2010-11-21
    相关资源
    最近更新 更多