说我有这两个类:
tables.py
class Device79table(tables.Table):
class Meta:
#link to datasource
model = Device79
attrs = {"class": "paleblue"}
models.py
class Device79(models.Model):
# data for table
我有一个引用这两个类的函数。
views.py
def function():
#makes table of all objects in device 79
table = Device79table(Device79.objects.all())
table.draw()
有可能做这样的事吗?假设参数' device' = Device79
def function(device)
table = device+table(device.objects.all())
table.draw()
这样就可以根据设备的值绘制表格了。即,设备可以是Device79,Device80,Device81等。程序将自动绘制正确的表。
答案 0 :(得分:0)
我不知道Device79table
的定义位置,但我会假设global
我对它的假定义:
def Device79Table(arg):
print arg
将其与您的功能整合:
def function(device):
globals()[device + 'table'](device.objects.all())
table.draw()
globals()
函数返回所有全局对象的dict
,其中键是其名称的字符串。因此globals()['Device79table']
与Device79table
答案 1 :(得分:0)
<强>更新强>
这是一个新的解决方案,它考虑到您实际上没有实例化类,而是直接使用类对象。
由于必须在Device79
之前定义Device79table.Meta
,因此您无法告诉Device79
在其自己的定义中使用哪个表格。你甚至不能在Device79table
期间这样做,因为它还不存在。
因此,在定义相应的表后,您需要告诉Device79
哪个表使用。
正如您所看到的,我还选择不使用动态变量名,而是使用另一个明确定义的对象。动态变量名称使您的代码更难以阅读和维护。
<强> models.py 强>
class Device79(models.Model):
table = None # Optional, but cleaner.
<强> tables.py 强>
import models
class Device79table(tables.Table):
class Meta:
# link to datasource
model = models.Device79
attrs = {"class": "paleblue"}
# once the table is defined, we can tell Device79 which table to use.
models.Device79.table = Device79table
<强> views.py 强>
import tables # "from tables import Device79table" would work too.
from models import Device79
# You need to import tables, even if you access the tables from the models,
# because this is where we tell the device which table to use.
def function(device)
table = device.table(device.objects.all())
table.draw()
function(Device79)
通常,循环导入不是问题,只要您导入模块而不是单个对象,但由于您需要在定义表时直接访问模型,因此无法导入表格。 models.py
。这就是为什么我们在tables.py
中更改设备以告诉它使用哪个表,而不是直接在models.py
中设置它。
这样,我们就像这样保持导入链:views -> tables -> models
和models
从不尝试导入tables
,但这也意味着我们必须导入tables
至少在某处完成模型定义。
这有点令人惊讶,但我不能想到一种更简洁,更简单的方法,只使用类对象而不是实例。
答案 2 :(得分:0)
Python在反射中特别好。提供您的描述,以下是您可以做的事情的示例:
在models.py
:
class Device79:
objects = "Device79.objects"
在tables.py
:
class Device79table:
def __init__(self, devices):
self.devices = devices
def draw(self):
print "%s.draw() called with %s" % (self.__class__, self.devices)
然后在views.py
:
import tables
def function(device):
table = tables.__dict__[device.__name__ + 'table'](device.objects)
table.draw()
import models
function(models.Device79)
或者:
from models import Device79
function(Device79)