У меня следующий дизайн модели:
class Boat(models.Model):
name = models.CharField(max_length=30, null=False)
harbour = models.ForeignKey(Harbour, null=True, on_delete=models.SET_NULL)
class Harbour(models.Model):
name = models.CharField(max_length=60)
city = models.ForeignKey(City, null=True, related_name='city_harbours', on_delete=models.SET_NULL)
class City(models.Model):
name = models.CharField(max_length=80)
county = models.CharField(max_length=30, null=True)
class NearestCity(models.Model):
city = models.ForeignKey(City, related_name='city', null=False, on_delete=models.CASCADE)
near_city = models.ForeignKey(City, related_name='near_city', null=False, on_delete=models.CASCADE)
weight = models.DecimalField(null=False, max_digits=25, decimal_places=20)
Краткое объяснение:
A Boat
принадлежит Harbour
, а Harbour
принадлежитдо City
.
Не у всех городов есть гавань.
NearestCity
- это таблица, в которой хранится информация о том, насколько близок город к остальной части города. города: weight
- это десятичное значение, которое указывает, как далеко город от _near_city_. Чем меньше значение 'weight', тем ближе город к near_city. Например:
city near_city weight
---- --------- ------
London Rome 2.210103
London Manchester 0.113134
Это означает, что Манчестер ближе к Лондону, чем Рим.
Проблема, которую нужно решить:
Дано имягород без каких-либо связанных с гаванью, например, Берлин, желающих вернуть все лодки из тех ближайших городов, у которых есть хотя бы одна связанная с гаванью. Набор запросов этой Лодки должен быть заказан по weight
DESC.
Я действительно новичок с набором запросов django, и я попытался решить, используя annotate
с subqueries
, aggregations
и т. Д., Но я не смогдостичь этого.