在 Django 中为 4-D 类型的数组创建模型
Create Model for 4-D kind of array in Django
我有一些 逻辑 为我的 数据库 构造了一个 Django webapp 但我无法将它转换成 模型形式可用于Models.py
:
User : U
Transaction-ID : T
Datetime : D
Transaction-ID Status-1 for a today : A[0]
Transaction-ID Status-2 for a today : A[1]
Transaction-ID Status-3 for a today : A[2]
对于上面的逻辑,可以用 N
users : U[N]
where U[i] -> T[i][]
transaction,每个 交易 有 3 个交易属性 T[j] -> A[j][3]
。我应该如何为给定的细节构建一个 model。另外,如果可能的话,我如何为 Transaction 的三个 A[k]
状态存储 date wise Model 并将它们添加到 周明智和月明智平均并继续制作分贝。
意思是:
一个特定的用户可以完成变量数[= Transactions 的 88=] 个,每个 transaction 都有一个 key 提供用于获取特定 交易 的 状态 。就像赚取的能量点数,赚取的奖励点数和声望点数 获得。 定期 更新 点 每天、每周 每月所有交易由该用户 并将它们存储在数据库中 每个用户 应该做什么。
在 C++ 中会更容易,但由于我的项目基于 SQLite,它在 Django 框架 中内置运行,因此很难理解应该使用多少 模型 以及如何 link 它们来实现这个系统。如有任何建议,我们将不胜感激。
4维透视是因为:entry = U[N][M][3][D]
我为此目的放置了我项目的一部分,并为没有在这个答案中总结代码而道歉(因为我认为在没有测试的情况下总结它可能会出错所以我决定使用复制粘贴测试代码)。
当我想读取四个嵌套的 Django 管理模型 (4D) 并在代码中使用它们时,我执行了以下过程:
models.py:
from __future__ import unicode_literals
from django.db import models
from django.db.models.deletion import CASCADE
MODBUS_TYPES = (('tcp', 'Tcp'), ('udp', 'Udp'), ('ascii', 'Ascii'), ('rtu', 'Rtu'))
class BatteryMonitoringServer(models.Model):
enable = models.BooleanField(default=True)
name = models.CharField(max_length=150)
server_ip = models.GenericIPAddressField(default='0.0.0.0', null=True)
def __str__(self):
return self.name
class BatteryMonitoringDevice(models.Model):
bm_id = models.ForeignKey(BatteryMonitoringServer, on_delete=CASCADE)
enable = models.BooleanField(default=True)
name = models.CharField(max_length=100, null=True)
method = models.CharField(max_length=5, choices=MODBUS_TYPES)
bm_device_ip = models.GenericIPAddressField(default='127.0.0.1', null=True)
bm_device_port = models.IntegerField(default=5558, null=True)
baud_rate = models.IntegerField(null=True, default=9600)
class BatteryMonitoringSubDevice(models.Model):
enable = models.BooleanField(default=True)
name = models.CharField(max_length=100)
unit = models.IntegerField(default=1)
sub_bm_count = models.IntegerField(default=4, null=True, blank=True, name='bm')
fk = models.ForeignKey(BatteryMonitoringDevice, on_delete=CASCADE)
class BatteryMonitoringMeta(models.Model):
key = models.CharField(max_length=100)
value = models.CharField(max_length=100)
module = models.ForeignKey(BatteryMonitoringSubDevice, on_delete=CASCADE)
conf_reader.py
from battery_monitoring.models import BatteryMonitoringServer
from delta_device.utility import DictEncoder
class BMSubDeviceConf(object):
def __init__(
self,
start,
name,
unit,
bm,
meta_data):
self._start = start
self._name = name
self._unit = unit
self._bm = bm
self._meta_data = meta_data
@property
def start(self):
return self._start
@property
def name(self):
return self._name
@property
def unit(self):
return self._unit
@property
def bm(self):
return self._bm
@property
def meta_data(self):
return self._meta_data
class BMDeviceConf(object):
def __init__(
self,
bm_id,
start,
name,
method,
bm_device_ip,
bm_device_port,
baud_rate,
sub_devices=None):
self._id = bm_id
self._start = start
self._name = name
self._method = method
self._bm_device_ip = bm_device_ip
self._bm_device_port = bm_device_port
self._baud_rate = baud_rate
self._sub_devices = sub_devices or []
def add_sub_device(self, sub_device):
self._sub_devices.append(sub_device)
def get_sub_devices(self):
return self._sub_devices
@property
def start(self):
return self._start
@property
def id(self):
return self._id
@property
def name(self):
return self._name
@property
def bm_device_ip(self):
return self._bm_device_ip
@property
def bm_device_port(self):
return self._bm_device_port
@property
def baud_rate(self):
return self._baud_rate
class BMConf(object):
def __init__(
self,
start,
name,
server_ip,
devices=None,
): # :( :| :) (: :p
self._start = 'ON' if start else 'OFF'
self._name = name
self._server_ip = server_ip
self._devices = devices or []
def add_device(self, device):
self._devices.append(device)
def get_devices(self):
return self._devices
@property
def start(self):
return self._start
@property
def name(self):
return self._name
@property
def server_ip(self):
return self._server_ip
def get_server():
"""Using list method to make a fast sql reading."""
return list(BatteryMonitoringServer.objects.all())
def get_devices(dev):
return list(dev.batterymonitoringdevice_set.all())
def get_sub_devices(sub_dev):
return list(sub_dev.batterymonitoringsubdevice_set.all())
def get_metadata(metric):
return list(metric.batterymonitoringmeta_set.all())
class BMReadConf(object):
"""BM configuration Reader"""
def __init__(self):
pass
@classmethod
def get_bm_config(cls):
"""Read BM metrics and return it on a object list"""
result = list()
for srv in get_server():
data = BMConf(srv.enable,
srv.name,
srv.server_ip,)
for dev in get_devices(srv):
device = BMDeviceConf(
dev.bm_id,
dev.enable,
dev.name,
dev.method,
dev.bm_device_ip,
dev.bm_device_port,
dev.baud_rate,
)
for sub_dev in get_sub_devices(dev):
meta_data = {}
for meta in get_metadata(sub_dev):
meta_data[meta.key] = meta.value
sub_device = BMSubDeviceConf(
sub_dev.enable,
sub_dev.name,
sub_dev.unit,
sub_dev.bm,
meta_data,
)
device.add_sub_device(sub_device)
data.add_device(device)
result.append(data)
return result
用法(test.py)
from battery_monitoring.conf_reader import BMReadConf
conf_obj = BMReadConf()
configs = conf_obj.get_bm_config()
for cnf in configs:
print(cnf.name) # This is name field in BatteryMonitoringServer Table.
devices = cnf.get_devices()
for dev in devices:
print(dev.baud_rate) # This is baud_rate field in second nested table.
sub_devices = dev.get_sub_devices()
for sub_dev in sub_devices:
print(sub_dev.unit) # This is unit field in third nested table.
print(sub_dev.meta_data) # This is meta_data table (fourth nested table).
希望对您有所帮助。
[注意]:
第四个嵌套 table(meta_data)有一个递增的 key/value 字段。
我有一些 逻辑 为我的 数据库 构造了一个 Django webapp 但我无法将它转换成 模型形式可用于Models.py
:
User : U
Transaction-ID : T
Datetime : D
Transaction-ID Status-1 for a today : A[0]
Transaction-ID Status-2 for a today : A[1]
Transaction-ID Status-3 for a today : A[2]
对于上面的逻辑,可以用 N
users : U[N]
where U[i] -> T[i][]
transaction,每个 交易 有 3 个交易属性 T[j] -> A[j][3]
。我应该如何为给定的细节构建一个 model。另外,如果可能的话,我如何为 Transaction 的三个 A[k]
状态存储 date wise Model 并将它们添加到 周明智和月明智平均并继续制作分贝。
意思是:
一个特定的用户可以完成变量数[= Transactions 的 88=] 个,每个 transaction 都有一个 key 提供用于获取特定 交易 的 状态 。就像赚取的能量点数,赚取的奖励点数和声望点数 获得。 定期 更新 点 每天、每周 每月所有交易由该用户 并将它们存储在数据库中 每个用户 应该做什么。
在 C++ 中会更容易,但由于我的项目基于 SQLite,它在 Django 框架 中内置运行,因此很难理解应该使用多少 模型 以及如何 link 它们来实现这个系统。如有任何建议,我们将不胜感激。
4维透视是因为:entry = U[N][M][3][D]
我为此目的放置了我项目的一部分,并为没有在这个答案中总结代码而道歉(因为我认为在没有测试的情况下总结它可能会出错所以我决定使用复制粘贴测试代码)。
当我想读取四个嵌套的 Django 管理模型 (4D) 并在代码中使用它们时,我执行了以下过程:
models.py:
from __future__ import unicode_literals
from django.db import models
from django.db.models.deletion import CASCADE
MODBUS_TYPES = (('tcp', 'Tcp'), ('udp', 'Udp'), ('ascii', 'Ascii'), ('rtu', 'Rtu'))
class BatteryMonitoringServer(models.Model):
enable = models.BooleanField(default=True)
name = models.CharField(max_length=150)
server_ip = models.GenericIPAddressField(default='0.0.0.0', null=True)
def __str__(self):
return self.name
class BatteryMonitoringDevice(models.Model):
bm_id = models.ForeignKey(BatteryMonitoringServer, on_delete=CASCADE)
enable = models.BooleanField(default=True)
name = models.CharField(max_length=100, null=True)
method = models.CharField(max_length=5, choices=MODBUS_TYPES)
bm_device_ip = models.GenericIPAddressField(default='127.0.0.1', null=True)
bm_device_port = models.IntegerField(default=5558, null=True)
baud_rate = models.IntegerField(null=True, default=9600)
class BatteryMonitoringSubDevice(models.Model):
enable = models.BooleanField(default=True)
name = models.CharField(max_length=100)
unit = models.IntegerField(default=1)
sub_bm_count = models.IntegerField(default=4, null=True, blank=True, name='bm')
fk = models.ForeignKey(BatteryMonitoringDevice, on_delete=CASCADE)
class BatteryMonitoringMeta(models.Model):
key = models.CharField(max_length=100)
value = models.CharField(max_length=100)
module = models.ForeignKey(BatteryMonitoringSubDevice, on_delete=CASCADE)
conf_reader.py
from battery_monitoring.models import BatteryMonitoringServer
from delta_device.utility import DictEncoder
class BMSubDeviceConf(object):
def __init__(
self,
start,
name,
unit,
bm,
meta_data):
self._start = start
self._name = name
self._unit = unit
self._bm = bm
self._meta_data = meta_data
@property
def start(self):
return self._start
@property
def name(self):
return self._name
@property
def unit(self):
return self._unit
@property
def bm(self):
return self._bm
@property
def meta_data(self):
return self._meta_data
class BMDeviceConf(object):
def __init__(
self,
bm_id,
start,
name,
method,
bm_device_ip,
bm_device_port,
baud_rate,
sub_devices=None):
self._id = bm_id
self._start = start
self._name = name
self._method = method
self._bm_device_ip = bm_device_ip
self._bm_device_port = bm_device_port
self._baud_rate = baud_rate
self._sub_devices = sub_devices or []
def add_sub_device(self, sub_device):
self._sub_devices.append(sub_device)
def get_sub_devices(self):
return self._sub_devices
@property
def start(self):
return self._start
@property
def id(self):
return self._id
@property
def name(self):
return self._name
@property
def bm_device_ip(self):
return self._bm_device_ip
@property
def bm_device_port(self):
return self._bm_device_port
@property
def baud_rate(self):
return self._baud_rate
class BMConf(object):
def __init__(
self,
start,
name,
server_ip,
devices=None,
): # :( :| :) (: :p
self._start = 'ON' if start else 'OFF'
self._name = name
self._server_ip = server_ip
self._devices = devices or []
def add_device(self, device):
self._devices.append(device)
def get_devices(self):
return self._devices
@property
def start(self):
return self._start
@property
def name(self):
return self._name
@property
def server_ip(self):
return self._server_ip
def get_server():
"""Using list method to make a fast sql reading."""
return list(BatteryMonitoringServer.objects.all())
def get_devices(dev):
return list(dev.batterymonitoringdevice_set.all())
def get_sub_devices(sub_dev):
return list(sub_dev.batterymonitoringsubdevice_set.all())
def get_metadata(metric):
return list(metric.batterymonitoringmeta_set.all())
class BMReadConf(object):
"""BM configuration Reader"""
def __init__(self):
pass
@classmethod
def get_bm_config(cls):
"""Read BM metrics and return it on a object list"""
result = list()
for srv in get_server():
data = BMConf(srv.enable,
srv.name,
srv.server_ip,)
for dev in get_devices(srv):
device = BMDeviceConf(
dev.bm_id,
dev.enable,
dev.name,
dev.method,
dev.bm_device_ip,
dev.bm_device_port,
dev.baud_rate,
)
for sub_dev in get_sub_devices(dev):
meta_data = {}
for meta in get_metadata(sub_dev):
meta_data[meta.key] = meta.value
sub_device = BMSubDeviceConf(
sub_dev.enable,
sub_dev.name,
sub_dev.unit,
sub_dev.bm,
meta_data,
)
device.add_sub_device(sub_device)
data.add_device(device)
result.append(data)
return result
用法(test.py)
from battery_monitoring.conf_reader import BMReadConf
conf_obj = BMReadConf()
configs = conf_obj.get_bm_config()
for cnf in configs:
print(cnf.name) # This is name field in BatteryMonitoringServer Table.
devices = cnf.get_devices()
for dev in devices:
print(dev.baud_rate) # This is baud_rate field in second nested table.
sub_devices = dev.get_sub_devices()
for sub_dev in sub_devices:
print(sub_dev.unit) # This is unit field in third nested table.
print(sub_dev.meta_data) # This is meta_data table (fourth nested table).
希望对您有所帮助。
[注意]:
第四个嵌套 table(meta_data)有一个递增的 key/value 字段。