Estoy tratando de implementar un filtro personalizado en el marco de descanso de Django, que devuelve a los usuarios dentro de una distancia determinada, estoy usando filtros de Django. Supongo que la latitud y la longitud ya están proporcionadas por el front-end.
esto es lo que probé. No sé si es la forma correcta de hacerlo. tengo el siguiente error
'RenameAttributes' object is not iterableAquí está mi código
Vistas.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 = CustomFilterModelos.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()Creo que el error que aparece aquí no está relacionado con el cálculo/filtrado de la distancia, podría ser una configuración incorrecta. Asegúrese de que DEFAULT_FILTER_BACKENDS sea una tupla o una lista válida.