代码之家  ›  专栏  ›  技术社区  ›  Josh Smeaton

是否可以指示Django基于其字段将模型实例保存到特定表中?

  •  1
  • Josh Smeaton  · 技术社区  · 14 年前

    我正在尝试构造一个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)
    
    

    insert into table_1 (..fields..) values (..field values..)

    这可能吗?我想我可以连接到信号或保存方法,但我想找到最简单的方法,如果这样的存在。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Will Hardy    14 年前

    可以动态创建非托管模型。您只需要创建一个dict,将列名映射到数据值。一旦你有了它,你可以做以下事情:

    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