Оптимизация DFS в Django - PullRequest
       66

Оптимизация DFS в Django

0 голосов
/ 21 сентября 2019

У меня есть пользователи в каком-то дереве, представляющем мою партнерскую систему.Мне нужно получить и подсчитать всех пользователей, которые находятся под мной в дереве (мои партнеры).Я реализовал модифицированную версию алгоритма глубокого первого поиска, но он работает медленно, потому что он делает много обращений к базе данных, чтобы получить каждого пользователя и его партнеров.Как я могу оптимизировать весь этот процесс, чтобы он работал быстрее?

User модель

class User(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(default="", max_length=30, blank=True)
    invited_by = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)
    partners = models.ManyToManyField('self', blank=True) # here are all user's partners
    wallet = models.CharField(blank=True, max_length=128)
    level = models.PositiveIntegerField(default=0)
    turnover = models.FloatField(default=0.0)
    created = models.DateTimeField(default=timezone.now)

Это моя функция DFS.Он принимает текущий User объект и возвращает список пользователей, которые находятся под ним в этом дереве

def dfsgetlist(user):
    q = []
    for i in user.partners.all():
        if i != user and i != user.invited_by:
            q += dfsgetlist(i)
    return q + [user]
...