Что имею: есть два класса - ТочкаНаКарте и Расстояние. Второй хранит все расстояния между точками.
Задача: необходимо выбрать все точки_на_карте, попадающие под определённое расстояние.
class Точка_На_Карте(АбстрактнаяМодель):
_х = models.IntegerField(db_column="х")
_у = models.IntegerField(db_column="у")
_карта = models.ForeignKey("Карта", db_column="карта", related_name="имеющиеся_точки")
_расстояние = models.ManyToManyField(
"self",
through="Расстояние",
symmetrical=False,
related_name="расстояния_до_точек"
)
class Расстояние(АбстрактнаяМодель):
_исходная_координата = models.ForeignKey(
"Точка_На_Карте",
on_delete=models.CASCADE,
related_name="расстояния"
)
_конечная_координата = models.ForeignKey(
"Точка_На_Карте",
on_delete=models.CASCADE,
related_name="+"
)
_расстояние = models.FloatField()
Какое-то решение:
точка_на_карте.расстояния.filter(
_расстояние__lt=необходимое_расстояние
).order_by("_расстояние")
Оно в целом делает, что нужно, но возвращает расстояния, а не точки.
Если обращаться через менеджер many-to-many:
точка_на_карте.расстояния_до_точек.all()
То оказывается, что он всё-таки возвращает точки, но я не могу найти способ отфильтровать по расстоянию.
В идеале нужно добавить свой метод в many-to-many, который бы возвращал нужный список точек, но не получается добавить туда свой менеджер - use_for_related_fields
- не помог.
Вот первый вопрос у меня - Как его туда добавить?
Второй вопрос - Как вообще составить запрос, который бы возвращал точки подходящие по расстоянию?
Updated 29 June 2016, 8:37 by Michael.