2010-10-11 59 views
1

我正试图构建一个Django应用程序,模拟现有的一组表。这些表都具有相同的字段,加上每个表的自定义字段。我想要做的是对这个结构进行建模,并根据它们所附的表格模型将记录保存到特定的表格中。是否可以指示Django根据其字段将模型实例保存到特定的表中?

这些表格可以经常创建,因此每个表格构建新模型是不可行的。

也许代码将展示什么,我想更清楚地做:



class CustomField(models.Model): 
    column_name = models.CharField(max_length=100) 
    description = models.CharField(max_length=255, blank=True, null=True) 

class CustomData(models.Model): 
    custom_field = models.ForeignKey(CustomField) 
    value = models.CharField(max_length=100, blank=True, null=True) 
    # value will always be a nullable varchar(100) 

class Table(models.Model): 
    table_name = models.CharField(max_length=255) 
    name = models.CharField(max_length=100) 
    custom_fields = models.ManyToManyField(CustomField) 

class Record(models.Model): 
    table = models.ForeignKey(Table) 
    ... list of common fields omitted ... 
    custom_values = models.ManyToManyField(CustomData) 

当保存有一个外键“TABLE_1”的新纪录,我想最后的操作沿行insert into table_1 (..fields..) values (..field values..)

这可能吗?我想我可以挂钩到信号或保存方法中,但如果存在这种方法,我希望找到最简单的方法。

回答

1

您可以动态创建非托管模型。您只需要为数据值创建一个字典映射列名称。一旦你有,你可以做到以下几点:

from django.db import models 

# This is the dict you created, mapping column names to values 
values = {col_1: value_1, col_2: value_2, col_3: value_3, ... } 

# Create a dict defining the custom field types, eg {col_name: django_field} 
attrs = dict((c, models.CharField(max_length=100, blank=True, null=True)) for c in values) 

# Add a Meta class to define the table name, eg table_1 
class Meta: 
    app_label = myapp 
    db_table = 'table_1' 
    managed = False 
attrs['Meta'] = Meta 
attrs['__module__'] = 'path.to.your.apps.module' 

DynamicModel = type('MyModel', (models.Model,), attrs) 

# Save your data 
DynamicModel.objects.create(**values) 

总结这件事的功能,并把它放在你的.save()方法上Record。如果您有任何公共字段,则可以将它们添加到attrs,甚至更好:创建一个包含所有常用字段的抽象模型,并在上面的最后一行中继承该模型,而不是models.Model

+0

这正是我最终实现它的原因,包括所有常见数据的抽象基础模型。以这种方式创建额外的字段要比我打算做的要好得多。我打算使用add_to_class(在ModelBase上定义),但现在肯定不会。谢谢。 – 2010-10-11 09:08:37

相关问题