Является ли хорошей практикой вызывать объект и повторно присваивать ему значение в Python/Django?
views.py
from rest_framework import views
from rest_framework.response import Response
from .models import Category
from .services.get_categories import cached_categories
from .serializers import CategorySerializer
class CategoryTreeList(views.APIView):
def get(self, request, format=None):
queryset = Category.objects.all()
cached_categories(queryset)
serializer = CategorySerializer(cached_categories.get_cached_root_nodes(), many=True)
return Response(serializer.data)
serializers.py
from .models import Category
from rest_framework import serializers
from .services.get_categories import cached_categories
class CategorySerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ('id', 'name', 'children', )
def get_children(self, obj):
children = cached_categories.get_children(obj)
if children:
return CategorySerializer(children, many=True).data
else:
return []
get_categories.py
from ..models import Category
class CachedCategories:
def __init__(self):
self.queryset = None
def __call__(self, queryset):
self.queryset = queryset
def split_on_dicts(self):
objects_by_depth = {}
for i in [obj.depth for obj in self.queryset]:
objects_by_depth.update({f"{i}": [obj for obj in self.queryset if obj.depth == i]})
return objects_by_depth
def get_children(self, parent: Category):
categories = self.split_on_dicts().get(f"{parent.depth + 1}")
children = []
if categories:
for obj in categories:
if obj.path.startswith(parent.path) and \
obj.depth == parent.depth + 1:
children.append(obj)
return children
def get_cached_root_nodes(self):
return self.split_on_dicts().get("1")
cached_categories = CachedCategories()
Объясняю, что я хочу.
Я создал приложение django с вложенными категориями.
И я хотел передать категории в serializator с помощью одного запроса. И я сделал это.
Затем я понял, что мой класс CachedCategories
(в get_categories.py) работает только один раз, когда я запускаю сервер и загружаю просматриваемую страницу API, но он должен работать каждый раз, когда страница перезагружается.
В конце концов мне пришло в голову, что это из-за того, что метод get()
не инициирует класс CachedCategories
(в get_categories.py).
И я решил переназначать значение queryset
после каждой загрузки страницы (я переназначаю значение в методе get()
класса CategoryTreeList
в views.py). Для получения такого результата я переопределяю метод __call__
в CachedCategories
(в get_categories.py).
Итак, является ли хорошей практикой вызывать объект и повторно присваивать ему значение?
Может быть, есть более лаконичные способы решить мою проблему?