Переопределение queryset в Django Admin без эффектов
Извините, если я повторяюсь в широко обсуждаемой теме, но я не могу понять, где ошибка, поскольку debug возвращает правильный результат, а страница в браузере - нет. Вкратце, я реализую приложение, которое является многопользовательским и многопользовательским, с использованием модуля django-organizations. Каждая модель, идентифицирующая определенные ресурсы, имеет поле 'gruppo', Foreign Key для конкретного арендатора. Кроме того, сессия содержит используемый арендатор('gruppo_utente'), чтобы позволить сменить одного арендатора на другого, просто изменив данные, хранящиеся в сессии.
request.session['gruppo_utente']=int(tenant) # =gruppo_id
Это модель:
//model.py
from multigroup.models import Gruppo, GruppoUser
from mptt.models import MPTTModel, TreeForeignKey
class ContoCOGE (MPTTModel):
gruppo = models.ForeignKey(Gruppo, on_delete=models.CASCADE, related_name='contoCOCGE_gruppo')
nome = models.CharField(max_length=2,default='')
descrizione = models.CharField("Descrizione",max_length=50,default='')
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['nome']
class Meta:
verbose_name = "Conto"
verbose_name_plural = "Conti"
def antenati(self):
tmp=''
if self.is_root_node():
return format_html(f'<b> {{}} - {{}} </b>', mark_safe(self.nome), mark_safe(self.descrizione))
for i in self.get_ancestors():
tmp += i.nome + '.'
return tmp+self.nome+' - '+self.descrizione
antenati.allow_tags = True
def __str__(self):
tmp=''
if self.is_root_node():
return format_html(f'<b> {{}} - {{}} </b>', mark_safe(self.nome), mark_safe(self.descrizione))
for i in self.get_ancestors():
tmp += i.nome + '.'
return tmp + self.nome
__str__.allow_tags = True
На странице администратора я пытаюсь перезаписать get_queryset(), используя следующее определение:
#admin.py
class ContoCOGEAdmin (DjangoMpttAdmin):
def get_queryset(self, request):
qs = super().get_queryset(request)
if 'gruppo_utente' in request.session:
return qs.filter(gruppo_id=int(request.session['gruppo_utente']))
else:
return qs
form = postForm ...
.... //other stuff
но страница в браузере всегда возвращает одно и то же. Это таблица данных ContoCOGE:
Если gruppo_utente = '3', шестой ряд не должен отображаться, но почему:
Отладка из vscodium, однако, проходит нормально:
где qs.filter(gruppo_id=int(request.session['gruppo_utente'])) возвращает:
<TreeQuerySet [<ContoCOGE: <b> 01 - ATTIVO </b>>, <ContoCOGE: 01.10>, <ContoCOGE: <b> 50 - Passivo </b>>, <ContoCOGE: 50.51>, <ContoCOGE: 50.51.01>, <ContoCOGE: <b> 58 - TEMP2 </b>>]>
Заранее спасибо
Похоже, что переопределение get_queryset() в MPPTModel неэффективно; согласно документации, я решил эту проблему переопределением метода filter_tree_queryset() для фильтрации кверисета для дерева. Документацию следует обновить, так как метод принимает 3 аргумента, а не 2
class ContoCOGEAdmin (DjangoMpttAdmin):
form = postForm
//[...]
def filter_tree_queryset(self, queryset,request):
qs = queryset.filter(gruppo_id=int(request.session['gruppo_utente']))
num = len(qs)
return qs