簡體   English   中英

Django ListCreateAPIView 不調用 get_queryset

[英]Django ListCreateAPIView not calling get_queryset

幾周前我開始使用 Django,我想返回最接近查詢參數中發送的位置的對象。 我認為函數get_queryset永遠不會被調用,因為它不會改變任何東西。

這些是我擁有的文件:

#models.py
from django.contrib.gis.db import models

class CarOffering(models.Model):
    name = models.CharField(max_length=200)
    location = models.PointField(null=True,blank=True)

    def __str__(self):
        return self.name
#serializer.py
from .models import CarOffering
from rest_framework import serializers

class CarSerializer(serializers.ModelSerializer):
    distance = serializers.FloatField(source='distance.mi', read_only=True, required=False)
    class Meta:
        model = CarOffering
        fields = ['name','location', 'distance']
        read_only_fields = ['location']
#Views.py
from .models import CarOffering
from django.contrib.gis.geos import GEOSGeometry
from django.contrib.gis.db.models.functions import Distance
from .serializers import CarOfferingSerializer

from django.shortcuts import render
from rest_framework.generics import ListCreateAPIView

import geocoder

class ListCreateCarOffering(ListCreateAPIView):
    queryset = CarOffering.objects.all()
    serializer_class = CarOfferingSerializer

    def get_queryset(self):
        qs = super().get_queryset()
        latitude = self.request.query_params.get('lat', None)
        longitude = self.request.query_params.get('lng', None)

        if latitude and longitude:
            pnt = GEOSGeometry('POINT(' + str(longitude) + ' ' + str(latitude) + ')', srid=4326)
            qs = qs.annotated(distance=Distance('location', pnt)).order_by('distance')

        return qs
#urls.py
from django.contrib import admin
from django.urls import path
from proj.views import ListCreateCarOffering

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/caroffer', ListCreateCarOffering.as_view(),name = 'list_caroffer')

當我看着http://127.0.0.1:8000/api/caroffer我得到同樣的事情,如果我這樣做http://127.0.0.1:8000/api/caroffer?lat=0&lng=0

[
    {
        "name": "test2",
        "location": "SRID=4326;POINT (-0.9024781294996892 37.71827450265065)"
    },
    {
        "name": "test3",
        "location": "SRID=4326;POINT (0 0)"
    }
]

知道為什么我沒有得到距離屬性嗎? 謝謝!

我對 Django 也有些陌生,但能夠通過在 ListAPIView 下定義“get”方法來實現這一點,然后從那里使用查詢集和響應參數。

我沒有為距離表達式安裝依賴項的麻煩; 盡管如此,URL 調度似乎仍然運行所需的 annotate 方法:

class ListCreateCarOffering(ListCreateAPIView):
    queryset = CarOffering.objects.all()
    serializer_class = CarSerializer

    def get(self, request):
        
        latitude = self.request.query_params.get('lat', None)
        longitude = self.request.query_params.get('lng', None)

        if latitude and longitude:

            pnt = "id"
            qs = self.queryset.annotate(distance=Count(pnt)).order_by('distance')

        return HttpResponse([{'name': q.name, 'location': q.location, 'distance': q.distance} for q in qs])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM