动态模型的主键

时间:2014-05-24 16:20:17

标签: python django django-models primary-key

我正在使用动态模型构建应用程序(遵循[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_key字段myID的定义,而是创建了默认的id字段。

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

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

2 个答案:

答案 0 :(得分:3)

您的字段和方法不应位于'fields'的{​​{1}}词典中,而应位于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

答案 1 :(得分:2)

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

你确定这是正确的做法吗?您不想使用manage.py inspectdb来创建该数据库中的模型吗?参见:

https://docs.djangoproject.com/en/dev/howto/legacy-databases/