python - 在Django rest框架中过滤给定距离内的用户
问题描述
我正在尝试在 Django rest 框架中实现一个自定义过滤器,它返回给定距离内的用户,我正在使用 Django 过滤器。我假设前端已经提供了纬度和经度。
这是我试过的。我不知道这是否是正确的做法。我有以下错误
'RenameAttributes' object is not iterable
这是我的代码
视图.py
def calculateDistance(lon1, lat1, lon2, lat2):
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
return 6371 * (
acos(sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(lon1 - lon2))
)
class CustomFilter(django_filters.rest_framework.DjangoFilterBackend):
def filter_queryset(self, request , queryset,view):
alluser = queryset
newQueryset = []
distparam = request.GET.get('distance')
if distparam and bool(int(distparam)):
for user in alluser:
current_user_long = request.user.Longitude
current_user_lat = request.user.Latitude
alluser_long = user.Longitude
alluser_lat = user.Latitude
distance = calculateDistance(current_user_long, current_user_lat, alluser_long, alluser_lat)
if distance > distparam:
newQueryset.push(user)
return newQueryset
return queryset
class UserFilter(filters.FilterSet):
class Meta:
model = User
fields =['gender', 'last_name', 'first_name' ]
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filterset_class = UserFilter
filter_backends = CustomFilter
模型.py
class User(AbstractUser):
username = None
email = models.EmailField(
max_length=100, verbose_name='email', unique=True)
gender = models.CharField(
max_length = 20,
choices = GENDER_CHOICES,
default = 'М'
)
avatar= ProcessedImageField(upload_to='avatars',
processors=[ResizeToFill(400, 400), Watermark()],
format='JPEG',
options={'quality': 72})
likes = models.ManyToManyField('User', blank=True, related_name="like")
latitude = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)
longitude = models.DecimalField(max_digits=22, decimal_places=16, blank=True, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
解决方案
我认为这里出现的错误与距离计算/过滤无关,可能是设置不正确请确保 DEFAULT_FILTER_BACKENDS 是有效的元组或列表
推荐阅读
- php - 用于 PHP 代码导航的 VS Code 扩展
- java - 从 Activity 外部调用 startActivity()
- c++ - 为什么通过`std::vector`进行迭代比通过`std::array`进行迭代更快?
- go - golang 是否深度复制整个接收器值?
- asp.net - jQuery DataTable 服务器端处理集成
- reactjs - 使用 Framer-motion 悬停在父级时为子级设置动画
- java - 即使我们在 catch 块中处理异常,如何在 spring 中使用 @ControllerAdvice 处理异常
- python - pytesseract - 识别不同背景的文本
- javascript - 在 React Native 应用程序(使用 Expo + Redux)中在哪里初始化 API 密钥(例如:Amplitude)?
- node.js - heroku 不使用纱线缓存模块