поиск отношения глубины - PullRequest
1 голос
/ 20 марта 2011

Я ищу "pythonic" / "orm-ic" решение для этой проблемы ...

Модель Soldier имеет себе ManyToManyField.

class Soldier(models.Model):
    ...
    subordinates = models.ManyToManyField('Soldier', ...)

A, B и C являются Soldier объектами

Они образуют своего рода «цепочку команд» примерно так: A> B> C

B находится в A.subordinates.all()
C находится в B.subordinates.all()

Каков наилучший способ получить всех подчиненных A?
Что-то вроде A.get_all_subordinates(), которое должно вернуть [B, C].

Мы не знаем, сколько уровней этого отношения существует во время выполнения.(C может иметь своих подчиненных, B может иметь братьев и сестер и т. Д.)

1 Ответ

2 голосов
/ 20 марта 2011

Если вы смоделируете подчиненное отношение <-> подчиненного отношениями «многие ко многим», вы получите графоподобную структуру, которая может получить произвольный комплекс (например, круговые отношения). Это станет очень трудно эффективно запрашивать.

Если вам нужна древовидная структура (что означает, что у каждого Soldier есть самое большее одно прямое превосходство), вы можете использовать django-mptt :

from django.db import models
from mptt.models import MPTTModel

class Soldier(MPTTModel):
    parent = models.ForeignKey('self', null=True, blank=True)

Получить всех подчиненных так же легко, как и

subordinates = soldier.get_descendants()

И самое лучшее в get_descendants: он заставляет ровно один запрос получить всех потомков.

...