我正在使用动态模型(遵循[1]的准则)构建应用程序,以为现有数据库创建接口。

这是我创建模型之一的功能(实际上,它具有更多的字段和内容,但这应该足够了):

def create_model(name):
    # Meta class
    class Meta:
        pass

    # Set up a dictionary to simulate declarations within a class
    attrs = {'__module__': 'mymodule',
             'Meta': Meta,
             'fields': {
                'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
                '__unicode__': lambda self: self.myID,
                }
            }

    # Create the class, which automatically triggers ModelBase processing
    model = type(name, (models.Model,), attrs)

    admin.site.register(model, admin.ModelAdmin)

    return model


但是,当我尝试访问此模型时,得到以下OperationalError

(1054, "Unknown column 'database_table.id' in 'field list'")


似乎Django没有考虑我对字段prymary_keymyID定义,它正在创建默认的id字段。

我想念什么吗?它是与动态模型创建相关的“错误”吗?有人知道解决方法吗?谢谢

[1] https://code.djangoproject.com/wiki/DynamicModels

最佳答案

您的字段和方法不应位于'fields'attrs词典之内,而应位于attrs字典的顶级。

这个:

attrs = {'__module__': 'mymodule',
         'Meta': Meta,
         'fields': {
            'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
            '__unicode__': lambda self: self.myID,
            }
        }


在功能上等效于此:

class MyModel(models.Model):
    class Meta:
        pass

    fields = {
       'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
       '__unicode__': lambda self: self.myID,
      }

    def __unicode__(self):
        return self.myID


ModelBase元类采用在类的顶层定义的任何字段(实际上是具有contribute_to_class方法的任何对象),并使用该字段上的contribute_to_class方法将其“添加”到实际的类中。在此过程中,字段将添加到fields字典中,但是在运行实际的元类之前,您不应该定义字段字典。您的attrs应该看起来像这样:

attrs = {'__module__': 'mymodule',
         'Meta': Meta,
         'myID': models.CharField(max_length=2, db_column='myID', primary_key=True),
         '__unicode__': lambda self: self.myID,
        }

09-11 19:00
查看更多