Начиная с Django 3.0, поддерживается symmetrical=True
для рекурсивных отношений m2m с использованием модели through
. [ docs ]
Например, со следующими моделями, где объекты Town симметрично связаны друг с другом через объекты Roads:
class Town(models.Model):
neighboors = models.ManyToManyField('self', through='Road', symetrical=True)
class Road(models.Model):
from_town = models.ForeignKey('Town', models.CASCADE, related_name='road_from')
to_town = models.ForeignKey('Town', models.CASCADE, related_name='road_to')
Как получить все Road
экземпляров, связанных с указанным c town
?
Как объясняет do c, related_name
из двух fk в Road
модели должны быть разными, то есть один обратный процессор, такой как town.related_road
, не будет работать.
Конечно, я могу установить два разных related_name
и объединить результаты двух запросов, но это не кажется очень Pythoni c мне:
class Town(models.Model):
...
@property
def roads(self):
return self.road_to + self.road_from
Есть ли другой способ, которым я могу этого достичь?