TypeError:python中的元类冲突

时间:2012-07-29 04:37:43

标签: python django inheritance tastypie metaclass

我正在使用django-tastypie为我的webapp创建一个rest API。 我想创建如下所述的类,而不是明确地输入它们(我有超过100个类)

class CityResource(ModelResource):
    class Meta:
        queryset = City.objects.all()
class StateResource(ModelResource):
    class Meta:
        queryset = State.objects.all()
etc...

我在考虑在python中使用元类(我的方法可能有问题,但仍然希望以这种方式解决它,因为我想看看元类如何帮助我,也许是在现实生活中学习它的好方法)< / p>

我试过了:

class ClassFactory(type):
    def __new__(cls, name, bases, dct):
        return type.__new__(cls, name, bases, dct)

for model in get_models(app):
    name = "%sResource" % model._meta.object_name
    ClassFactory(name, (ModelResource, ), {'Meta':type('Meta', (), {'queryset': model.objects.all()})})

但这会产生错误:

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

我在谷歌上搜索了它,并且提到了如果一个类派生自另外两个具有两个不同元类的类,那么我生成的类必须具有从两个元类[*]派生的元类。

  1. 在我的情况下,这个错误是如何发生的,因为我是从同一个类ModelResource派生出来的?
  2. 我不确定我理解[*]
  3. 我可能以错误的方式解决这个问题,但需要一些指示。

1 个答案:

答案 0 :(得分:0)

(转发自评论。)

我认为你根本不需要ClassFactory“元类”。

klass = type(name, (ModelResource, ), {...})

应该根据需要为你提供一个派生自ModelResource的新类。