2

tastypieを使用してRESTfulAPIで単純なDjangoサービスを実装しようとしています。私の問題は、PUTを使用してWineResourceを作成しようとすると正常に機能しますが、POSTを使用するとHTTP501エラーが返されることです。おいしいドキュメントを読むと、うまくいくはずですが、そうではありません。

これが私のapi.pyコードです:

    class CustomResource(ModelResource):
    """Provides customizations of ModelResource"""
    def determine_format(self, request):
    """Provide logic to provide JSON responses as default"""
    if 'format' in request.GET:
        if request.GET['format'] in FORMATS:
        return FORMATS[request.GET['format']]
        else:
        return 'text/html' #Hacky way to prevent incorrect formats
    else:
        return 'application/json'

class WineValidation(Validation):
    def is_valid(self, bundle, request=None):
    if not bundle.data:
        return {'__all__': 'No data was detected'}

    missing_fields = []
    invalid_fields = []

    for field in REQUIRED_WINE_FIELDS:
        if not field in bundle.data.keys():
        missing_fields.append(field)
    for key in bundle.data.keys():
        if not key in ALLOWABLE_WINE_FIELDS:
        invalid_fields.append(key)

    errors = missing_fields + invalid_fields if request.method != 'PATCH' \
        else invalid_fields

    if errors:
        return 'Missing fields: %s; Invalid fields: %s' % \
            (', '.join(missing_fields), ', '.join(invalid_fields))
    else:
        return errors

class WineProducerResource(CustomResource):
    wine = fields.ToManyField('wines.api.WineResource', 'wine_set', 
                 related_name='wine_producer')
    class Meta:
    queryset = WineProducer.objects.all()
    resource_name = 'wine_producer'
    authentication = Authentication() #allows all access
    authorization = Authorization() #allows all access

class WineResource(CustomResource):
    wine_producer = fields.ForeignKey(WineProducerResource, 'wine_producer')

    class Meta:
    queryset = Wine.objects.all()
    resource_name = 'wine'
    authentication = Authentication() #allows all access
    authorization = Authorization() #allows all access
    validation = WineValidation()
    filtering = {
        'percent_new_oak': ('exact', 'lt', 'gt', 'lte', 'gte'),
        'percentage_alcohol': ('exact', 'lt', 'gt', 'lte', 'gte'),
        'color': ('exact', 'startswith'),
        'style': ('exact', 'startswith')

    }

    def hydrate_wine_producer(self, bundle):
    """Use the provided WineProducer ID to properly link a PUT, POST,
    or PATCH to the correct WineProducer instance in the db"""
    #Workaround since tastypie has bug and calls hydrate more than once
    try:
        int(bundle.data['wine_producer'])
    except ValueError:
        return bundle
    bundle.data['wine_producer'] = '/api/v1/wine_producer/%s/' % \
                        bundle.data['wine_producer']
    return bundle

どんな助けでも大歓迎です!:-)

4

1 に答える 1

7

これは通常、POSTを詳細uriに送信していることを意味します/api/v1/wine/1/。POSTは、囲まれたエンティティを従属として扱うことを意味するため、POSTをリストuriに送信すること/api/v1/wine/は、おそらくあなたが望むものです。

于 2012-10-18T03:25:20.653 に答える