1

単純なAPIとリソースを構成し、既存のDBに接続しました(そのため、モデルでテーブル名と列を指定する必要がありました)。オブジェクトを正常に作成して一覧表示できます。ただし、作成すると、Locationヘッダーを正しく取得できず、作成したデータを返すこともできません。

オブジェクトの作成:

curl --dump-header - -H "Content-Type: application/json" -X POST --data '{"system_key": "test","system_nam": "test","system_url": "https://test/test"}' http://127.0.0.1:7000/api/system/?ticket=TGT-585-d9f9effb36697401dce5efd7fc5b3de4

応答:

HTTP/1.0 201 CREATED
Date: Thu, 14 Feb 2013 18:58:17 GMT
Server: WSGIServer/0.1 Python/2.7.3
Vary: Accept
Content-Type: text/html; charset=utf-8
Location: http://127.0.0.1:7000/api/system/None/

Locationヘッダーに注目してください。オブジェクトは正常に作成されたようですが、情報がDBからAPIに返されていないため、応答で使用できます。わかりやすくするために、この行はDBテーブル上で完全です。

追加すると、次のalways_return_data = Trueようになります。

HTTP/1.0 400 BAD REQUEST
Date: Thu, 14 Feb 2013 19:00:32 GMT
Server: WSGIServer/0.1 Python/2.7.3
Content-Type: application/json

{"error": "The object '<system: MRMteste>' has an empty attribute 'system' and doesn't allow a default or null value."}

私のリソースとモデルは非常にシンプルです。

資源:

class SystemResource(ModelResource):    
    class Meta:        
        list_allowed_methods = ['get', 'post']
        detail_allowed_methods = ['get', 'put','patch']

        queryset = system.objects.all()
        resource_name = 'system'
        authorization = Authorization()
        authentication = customAuth.CustomAuthentication()

    def hydrate_system_timestamp(self, bundle):        
        bundle.data['system_timestamp'] = get_now_time()
        return bundle

モデル:

class system(models.Model):
    list_display = ('system_nam')
    system = models.IntegerField(primary_key=True, db_column="system_id")
    system_nam = models.CharField(max_length=50)
    system_key = models.CharField(max_length=255)
    system_url = models.CharField(max_length=100)
    is_deleted_flg = models.BooleanField()
    system_timestamp = models.DateTimeField(default=datetime.now)

    def __unicode__(self):
        return self.system_nam

    class Meta:
        db_table = "system"

これに関するドキュメントには何もありません。tastypieの経験が豊富な人なら誰でも、モデルとリソースが正しいかどうか教えてくれますか?この日付の時点で、最新バージョンのtastypieとdjangoを使用しています。

本当にありがとう

4

2 に答える 2

1

実際、私は問題を解決しました。

モデルでは、私が行ったように列名を定義する必要がある場合は、主キーでIntegerFieldを使用しないでください。このようにしてください:

system = models.AutoField(primary_key=True, db_column="system_id")

tastypieが新しく作成されたオブジェクトを処理する方法では、モデルで定義された自動インクリメントが必要であるため、最後に作成されたIDがわかります。良い発見、それがいつか誰かを助けることを願っています。

于 2013-02-15T13:02:50.407 に答える
1

リソースのメタクラスを設定する必要があります。

always_return_data = True

また、一意のIDフィールドを、サービスではなくデフォルトの名前IDで使用してみてください。

于 2013-02-14T23:53:25.567 に答える