Sergiy_Hanzhela
@Sergiy_Hanzhela
Начинающий разработчик!

Использование метода rebuild() в моделях MPTT?

Добрый день жители форума! Возникла такая проблема.
Есть модель пользователя
class StpUser(MPTTModel, AbstractUser):
    GENDER_CHOICES = ((1, _('Male'),), (2, _('Female'),),)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='clients',
                               db_index=True, verbose_name=_('Sponsor'))

кусочек кода чтоб было понятно про что речь. При регистрации пользователя выполняется
метод
StpUser.objects.rebuild()
который я так понимаю обновляет дерево зависимости в модели
так вот было замечено что с увеличением количества пользователей увеличивается и время выполнения этого метода сразу приведу код views где он используется
def email(request):
    form = EmailForm()
    if request.user.is_authenticated():
        return JsonResponse({'errors': _('You are currently logged in. Please log out first.')})
    if request.method == 'POST' and request.is_ajax():
        ValidateEmail(request.POST.get('email', ''))
    if request.POST:
        form = EmailForm(request.POST)
        if form.is_valid():
            try:
                existing_user = StpUser.objects.get(email=form['email'].value())
            except:
                existing_user = None
            if existing_user is not None:
                form = EmailForm(request.POST, instance=existing_user)
            u = form.save()
            u.parent_id = int(request.session.get('parent_user', None))
            u.from_page_id = request.session.get('page_id', None)
            try:
                u.from_page = UserPage.objects.get(pk=request.session.get('page_id', None))
            except:
                pass
            # raise Exception(request.session.get('parent_user', None))
            u.save()
            StpUser.objects.rebuild()
            domain = main_domain(request)['domain']
            _token = default_token_generator.make_token(u)
            verify_url = reverse('confirm-email', kwargs={
                "uidb36": int_to_base36(u.id),
                "token": _token})
            context = {
                "request": request,
                'domain': domain,
                "user": u,
                "verify_url": verify_url,
                'site': Site.objects.get_current(),
            }
            StpCacheToken.objects.create(user=u, token=_token, uidb36=int_to_base36(u.id), ts=now(),
                                         valid_to=now() + timedelta(days=30))
            tpl = MailTemplate.objects.get(filename='registration-by-email')
            data = tpl.render(context)
            send_mail(data['subject'], data['text'], settings.DEFAULT_FROM_EMAIL, [u.email], html_message=data['html'])
            # raise Exception(data['html'])
            # mail_sponsor = send_mail_to_sponsor(u.parent_id)
            _next = request.path
            if request.is_ajax():
                return JsonResponse({'message': _('Письмо было отправлено %s. '
                                                  'Следуйте инструкциям, приведенным в этом письме.') % (u.email,)})
            if request.GET.get('next', None) is not None:
                _next = request.GET.get('next', None)
            return redirect(_next)
        elif request.is_ajax():
            return JsonResponse({'errors': form.errors})
    return TemplateResponse(request, 'account/email_form.html', {'form': form, 'bs': request.GET.get('bootstrap', 0)})

Вопрос вот в чём как решить проблему с быстротой этого метода или может его вынести из функции или просто вызывать его внутри ?
  • Вопрос задан
  • 230 просмотров
Пригласить эксперта
Ответы на вопрос 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Метод rebuild() надо вызывать только тогда, когда дерево потеряло балансировку. Такое происходит только в том случае, если при внесении изменений произошёл сбой.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы