3

私はchoices、tastypie API を使用するクライアントにモデル フィールドを表すことができるかどうかを把握しようとしています。

django-tastypie (0.9.11) API を実装する django (1.4.1) アプリケーションがあります。次のような Model と ModelResource があります。

class SomeModel(models.Model):
    QUEUED, IN_PROCESS, COMPLETE = range(3)

    STATUS_CHOICES = (
        (QUEUED, 'Queued'),
        (IN_PROCESS, 'In Process'),
        (COMPLETE, 'Complete'),
    )

    name = models.CharFIeld(max_length=50)
    status = models.IntegerField(choices=STATUS_CHOICES, default=QUEUED)

class SomeModelResource(ModelResource):
    class Meta:
        queryset = SomeModel.objects.all()
        resource_name = 'some_model'

API でオブジェクトを見ると、名前とステータスのフィールドが次のように表示されます。

{
    ...
    "objects":[
    {
        "name": "Some name 1",
        "status": 0
    },
    {
        "name": "Some name 2",
        "status": 2
    }]
}

SomeModelResource水和/脱水メソッドを変更して、次のようにステータスの文字列値を表示できることはわかっています。これは、クライアントにとってより価値があります。

{
    ...
    "objects":[
    {
        "name": "Some name 1",
        "status": "Queued"
    },
    {
        "name": "Some name 2",
        "status": "Complete"
    }]
}

しかし、クライアントは、SomeModel の内部の仕組みを知らずに、ステータス フィールドで利用可能な選択肢をどのように知るのでしょうか?

システムでオブジェクトを作成しているクライアントは、デフォルト値QUEUEDが desirable であるため、ステータスを提供しない場合があります。ただし、オブジェクトを編集しているクライアントは、有効なオプションを提供するために、ステータスの利用可能なオプションを知る必要があります。

SomeModelResource のスキーマ記述に選択肢をリストして、クライアントがオブジェクトの作成/編集時に利用可能な選択肢を内省できるようにしたいと考えています。しかし、これがtastypieですぐに利用できるものなのか、それともtastypieをフォークして機能を導入する必要があるのか​​ どうかはわかりません.

フィードバックをお寄せいただきありがとうございます。

4

2 に答える 2

5

リソースのメソッドをオーバーライドすることで、選択肢をスキーマに追加できます。任意のフィールドに選択肢を追加したい場合 (おそらく多くのリソースで使用するため)、次のようにメソッドを作成できます。

def build_schema(self):
    base_schema = super(SomeModelResource, self).build_schema()
    for f in self._meta.object_class._meta.fields:
        if f.name in base_schema['fields'] and f.choices:
            base_schema['fields'][f.name].update({
                'choices': f.choices,
            })
    return base_schema

上記のコードはテストしていませんが、理解していただければ幸いです。object_classは、提供された から取得されているため、tastypie の ModelResource を使用する場合にのみ設定されることに注意してくださいqueryset

于 2012-09-27T07:19:21.403 に答える
1

より簡単な解決策は、選択肢の情報を help_text の宣伝文にハックすることです。

この例では、次のことができました。

source = models.CharField(
    help_text="the source of the document, one of: %s" % ', '.join(['%s (%s)' % (t[0], t[1]) for t in DOCUMENT_SOURCES]),
    choices=DOCUMENT_SOURCES,
)

簡単で、自動的に最新の状態に保たれ、ほとんど副作用がありません。

于 2013-10-29T21:23:31.650 に答える