[英]Django Crispy Form - ListView is not calling def get_queryset(self)
[英]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.