2010-10-11 52 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

相關問題