3

我正在使用 django-tastypie 为我的 web 应用程序创建一个休息 API。我想创建如下所述的类而不明确地全部输入它们(我有超过 100 个类)

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

我正在考虑在 python 中使用元类(我的方法可能是错误的,但仍然想以这种方式解决它,因为我想看看元类如何帮助我,也许是在现实生活中学习它的好方法)

我试过这个:

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. 我不确定我是否理解 [*]

我可能以错误的方式解决了这个问题,但需要一些指示。

4

1 回答 1

0

(转载自评论。)

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

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

应该为您提供一个从 ModelResource 派生的新类,如您所愿。

于 2012-07-29T06:53:47.523 回答