2015-11-05 48 views
1

我想使用Tastypie構建一個API來獲取經緯度對,然後在我的數據庫中搜索位置爲在該lat/long的給定距離內。要做到這一點,我的模型有一個方法,可以取得一對經/長對並從它自己的經緯線返回給定緯度/經度的距離。Django Tastypie:通過遍歷model.objects.all()來過濾GET調用的結果

換句話說,我想通過示範田不過濾,而是沿着線做的事情:

latitude = # somehow get from Tastypie request 
longitude = # somehow get from Tastypie request 
distance = 80 
all_models = Example.objects.all() 
within_range = [] 
for model in all_models: 
    distance_to_model = model.calculate_distance(latitude, longitude) 
    if distance_to_model <= 80: 
     within_range.append(model.name) 
# somehow return within_range to Tastypie 

我仔細閱讀該文檔和誠實感到有點不知所措 - 這是第一個API我會建立起來的,看起來這個功能應該很容易找到,但我很掙扎。

回答

0

首先,您應該重新思考您是否真的希望將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可以處理它們。

+0

非常感謝您的回覆!超級有用。我想我應該回去重新考慮我想用API來做什麼......現在,這是我想要的唯一終端,所以我想我應該刪除Tastypie,直到我真的需要RESTful。 –