【发布时间】:2012-07-27 05:56:43
【问题描述】:
我正在使用 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 中使用元类(我的方法可能是错误的,但仍然想以这种方式解决它,因为我想看看元类如何帮助我,也许是在现实生活中学习它的好方法)
我试过这个:
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
我用谷歌搜索了这个,到处都提到如果一个类派生自具有两个不同元类的其他 2 个类,那么我创建的类必须有一个从这两个元类派生的元类[*]。
- 在我的情况下,这个错误是如何发生的,因为我是从同一个类 ModelResource 派生的?
- 我不确定我是否理解 [*]
我可能以错误的方式解决了这个问题,但需要一些指示。
【问题讨论】:
-
"(我的方法可能是错误的,但仍然想这样解决)"我从来不理解这种态度。如果你的方法是错误的,那就改变它。我在这里没有什么建设性要说的,因为 django 经常让你做一些你通常不需要做的事情,但不要故意放弃一个潜在的更好的方法来做你正在做的事情。是的,100 节课听起来很疯狂。
-
我的想法是了解元类如何帮助我,这就是我问这个问题的原因。主要学习如何为此编写元类,如果可能的话,还要了解为什么这种方法可能是错误的。这就是态度。我一直认为至少在 SO 上问这样的问题是可以的。
-
另外,这个问题真的与 django 无关
-
我认为当您遇到需要使用元类解决的问题时,您应该学习如何使用元类(这种情况极为罕见,著名的 Python 核心开发人员表示,需要的方法不到 1% Python 开发人员)。我并不是说这里没有必要,它可能是,但要记住这一点。至于什么问题适合SO,我不知道,但我希望能帮助你编写好代码的问题成为基准。
-
我认为你根本不需要
ClassFactory“元类”。type(name, (ModelResource, ), {...})应该根据需要返回一个派生自 ModelResource 的新类。
标签: python django inheritance tastypie metaclass