15

django-mutant 0.0.2(on ) の実験を開始しdjango 1.4.2ましたが、ドキュメントが不足しているため、ほとんど何も得られませんでした。プロジェクトの説明で理解した方法では、それを使用してモデルを動的に作成django-adminできるため、インターフェイスに接続できると考えたので、モデルを作成し、そこにあるすべてのフィールドを定義できます。django-eavdynamo、Will Hardy'sなどの他の代替案を見ましたdynamic-modelsが、これが今までの最良の実装のように思えたので、これを使用する必要があると考えました。

私はこれを入れましたsettings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'south',
    'polymodels',
    'mutant',
    'mutant.contrib.boolean',
    'mutant.contrib.temporal',
    'mutant.contrib.file',
    'mutant.contrib.numeric',
    'mutant.contrib.text',
    'mutant.contrib.web',
    'mutant.contrib.related',
    'dynamodels'   # this is the name of my testapp
)

私は何をすべきかを理解するために のソースを開きました. andをインポートして登録するdjango-mutantだけで十分だと思ったので、これを試しました:mutant.models.ModelDefinitionmutant.models.FieldDefinitionadmin.py

from django.contrib import admin

from mutant import models


class ModelDefinitionAdmin(admin.ModelAdmin):
    pass

admin.site.register(models.ModelDefinition, ModelDefinitionAdmin)


class FieldDefinitionAdmin(admin.ModelAdmin):
    pass

admin.site.register(models.FieldDefinition, FieldDefinitionAdmin)

syncdb を実行した後、管理インターフェイスに「mutant」セクションがあり、その中に「モデル定義」と「フィールド」があります。のリストにあるアプリ名を指定できませんでしたが、モデルを正常に追加しましたINSTALLED_APPS。フィールドの追加がうまくいかなかったのは、以前に作成したモデルを選択したため (リストにあるのはこれだけでしたModel def)、. Content type保存ボタンを押すと、次のようになりました。

NotImplementedError at /admin/mutant/fielddefinition/add/

No exception supplied
...
...
/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in save
        return super(FieldDefinition, self).save(*args, **kwargs) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_polymodels-1.0.1-py2.6.egg/polymodels/models.py in save
        return super(BasePolymorphicModel, self).save(*args, **kwargs) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in save
        self.model_def.model_class(force_create=True) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in model_class
            model_class = self._create_model_class(existing_model_class) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in _create_model_class
        attrs = self.get_model_attrs(existing_model_class) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in get_model_attrs
                            for f in self.fielddefinitions.select_subclasses())) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/model/__init__.py in <genexpr>
                            for f in self.fielddefinitions.select_subclasses())) ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in field_instance
        cls = self.get_field_class() ...

/home/user/dev/virenvs/dynamicmodels/lib/python2.6/site-packages/django_mutant-0.0.2-py2.6.egg/mutant/models/field/__init__.py in get_field_class
            raise NotImplementedError 

したがって、それは私が自分のフィールド (またはモデルでさえ?) を定義する方法ではないかもしれません..プロジェクトのページには、クラスをサブクラス化するスニペットがあり、そのスニペットを my に入れ、そのクラスを my に登録するとFieldDefinition、DateFieldDefinition が作成されます。models.py管理者、どのタイプのフィールドも正常に追加できます。管理画面で作成できるようにするには、使用するすべてのフィールド タイプをサブクラス化する必要があるということですか? この方法で作成すると、実際にモデルにバインドされますか? 少なくとも基本を示す実際の例はどこかにありますか? 申し訳ありませんが、これは私が思いついた最短のバージョンでした。

更新: 試していたバージョンの指定を間違えました。最新の開発バージョン(ちなみに0.0.2でもあります)のNotImplementedErrorを取得しましたが、実際の0.0.2を試してみると、PyPiから同じ方法で取得しました開発者として、エラーメッセージなしでフォームエラーを受け取りましたが、検証で何かが失敗したことは間違いありません. したがって、一般的に私は解決策に近づいていません。

更新 2: ミュータントの基本フィールド タイプを管理者に動的に登録しました。この管理者スニペットを使用して、モデルとフィールドを追加/変更/削除できるようになりました。

from django.contrib import admin

from mutant import models

for field_type in models.FieldDefinitionBase._field_definitions.values():
    attrs = {'model': field_type}
    FieldDefAdmin = type('{0}Admin'.format(field_type.__name__),
                         (admin.ModelAdmin,),
                         attrs)
    admin.site.register(field_type, FieldDefAdmin)


class ModelDefinitionAdmin(admin.ModelAdmin):
    model = models.ModelDefinition

admin.site.register(models.ModelDefinition, ModelDefinitionAdmin)

ただし、たとえば mysql コンソールからデータベース内の実際のデータを調べると、テーブルがデータベースに存在しません。ミュータントのテーブルがあり、そこには私のモデルと私のフィールドに関するエントリが含まれていますが、動的モデル クラスが構築されると、それもそのままデータベースに書き込まれると思いました。

UPDATE3: 実際には間違っていました。テーブルはデータベースにあり、「mutant_」というプレフィックスが付いているだけなので、そこにあることを認識できませんでした。これは、それを操作するための有効な方法であるように見えますが、それを操作するためのまともなユーザーフレンドリーなインターフェイスを作成するには、さらに作業が必要になります.

4

1 に答える 1

6

わかりました、申し訳ありませんが、私が言ったようにまともなアプリを完成させるには忙しすぎます (そしておそらくもっと怠け者です)。しかし、少なくとも少しは役立つように、このトピックに関する汚いブログ投稿を作成し、ミュータント用のサンプル CRUD アプリを追加しました。

http://integricho.github.io/2013/07/22/mutant-introduction/

https://github.com/integricho/mutant-sample-app

于 2013-07-22T17:57:53.440 に答える