3

私は django-tastypie を使用して、webapp の残りの 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つの異なるメタクラスを持つ他の2つのクラスから派生した場合、私が作成したクラスには2つのメタクラスから派生したメタクラスが必要であると言及しています[*]。

  1. 私の場合、同じクラス ModelResource から派生しているため、このエラーはどのように発生しますか?
  2. よくわかりません [*]

この問題を間違った方法で解決している可能性がありますが、いくつかの指針が必要です。

4

1 に答える 1

0

(コメントからの転載です。)

ClassFactory「メタクラス」はまったく必要ないと思います。

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

必要に応じて、ModelResource から派生した新しいクラスを取得する必要があります。

于 2012-07-29T06:53:47.523 に答える