首先,您應該重新思考您是否真的希望將RESTful類型的API用作Tastypie。因爲擁有這種類型的界面非常通用,便於將數據公開給某些前端客戶端,但要求您堅持不符合當前問題的規則。
如果我理解正確,您只想爲此計算構建一個API端點。如果是的話,那麼您就不會使用RESTful類型的API。
我建議你建立簡單的JSON觀點:如果從某些原因
但是:
@csrf_exempt
def calculate_distance(request):
# Pass data in various ways
latitude = request.GET.get('latitude') or request.POST.get('latitude')
longitude = request.GET.get('longitude') or request.POST.get('longitude')
# Or pass data as JSON in request body
if request.method != 'POST':
return HttpResponseNotAllowed(permitted_methods=('POST',))
try:
data = json.loads(request.body)
except (AttributeError, ValueError):
return HttpResponseBadRequest(json.dumps({'message': 'json format incorrect'}),
content_type='application/json')
if data.get('latitude', None) and data.get('longitude', None):
within_range = []
for location in Location.objects.all():
distance_to_model = location.calculate_distance(data['latitude'], data['longitude'])
if distance_to_model <= 80:
within_range.append(location.name)
return HttpResponse(json.dumps({'success': True,
'within_range': within_range}),
content_type='application/json')
else:
return HttpResponseBadRequest(json.dumps({'message': 'offer_id is missing'}),
content_type='application/json')
你可以用更多的驗證,授權,認證等
EDITED升級這一觀點將決定堅持Tastypie在您的模型資源類中使用build_filters方法:
def build_filters(self, filters=None):
if filters is None:
filters = {}
orm_filters = super(OfferResource, self).build_filters(filters)
if 'pk__in' not in orm_filters:
orm_filters['pk__in'] = []
if 'latitude' in filters and 'longitude' in filters:
for entity in Example.objects.all():
distance_to_model = entity.calculate_distance(
filters['latitude'], filters['longitude'])
if distance_to_model <= 80:
orm_filters['pk__in'].append(entity.pk)
return orm_filters
現在可以請求您的資源?latitude = xxx & longitude = yyyy。記住過濾器傳遞的值總是字符串。確保calculate_distance可以處理它們。
非常感謝您的回覆!超級有用。我想我應該回去重新考慮我想用API來做什麼......現在,這是我想要的唯一終端,所以我想我應該刪除Tastypie,直到我真的需要RESTful。 –