В панели инструментов Оскара я могу сделать любую категорию root, я могу сделать детей под категорией. Эту функциональность я могу изучить в Django Oscar API Но я хочу унаследовать функциональность панели инструментов Oscars, где мы можем сделать любую категорию относительно другой категории. например, у меня есть 2 категории. 1) cat 1 a) subcat1 2) cat 2
Теперь, если мне нужно сделать subcat1 дочерним для cat2, я могу легко выбрать из выпадающего списка и установить для subcat1 значение cat2 на панели инструментов oscar. Но как я могу сделать то же самое, используя Django oscar restful API? Пожалуйста, дайте мне знать. Я проверил и обнаружил, что модель «категория» использует Деревья материализованных путей , чтобы достичь этой функциональности, как я могу использовать это для достижения функциональности древоборода для добавления узлов root, добавления потомков и обновление категорий по разным категориям и т. д. c?
это данные запроса, которые я получаю со стороны клиента.
{
"id": 104,
"url": "http://localhost:8000/api/admin/categories/104/",
"breadcrumbs": "Cat1 > subcat1",
"name": "subcat1",
"description": "My new one test Desc",
"slug": "subcat1",
"parent": "Cat1",
"children": "http://localhost:8000/api/admin/categories/Cat1/subcat1/",
#here parent slug will be the name of parent categories slug,this category belongs to, if it is a parent category, then parent_slug will be null, otherwise the name of parent slug.
"parent_slug": null,
}
Я переопределил представление Django API-интерфейсов oscar CategoryAdminDetail, Я пытаюсь сделать логи c, но я хочу динамически создавать и обновлять узлы категорий.
project / api / views / admin / product.py
class CategoryAdminDetail(product.CategoryAdminDetail):
"""RetrieveUpdateDestroyAPIView admin-category-detail (http://localhost:8000/api/admin/categories/14/)"""
queryset = Category.objects.all()
serializer_class = AdminCategorySerializer
renderer_classes = [CustomApiRenderer,BrowsableAPIRenderer]
def put(self, request, *args, **kwargs):
parent_slug_in_db = None
pk = self.kwargs.get("pk", None)
category_qs = Category.objects.filter(pk=pk).first()
"""If category exists"""
if category_qs:
path = category_qs.path
if category_qs.numchild == 0:
parent_slug_in_db = Category.objects.filter(path__startswith=category_qs.path[0:4],depth=category_qs.depth-1).first()
if parent_slug_in_db:
parent_slug_in_db = parent_slug_in_db.slug ##categories slug before update
slug = request.data.get('slug',None) #categories slug
name = request.data.get('name',None) #categories name
parent_slug = request.data.get('parent_slug',None) #categories parent slug
if parent_slug_in_db == parent_slug:
"""category is not assigned to other category: i.e no changes made from client side"""
print("""\ncategory is not assigned to other category: i.e no changes made from client side\n""")
else:
"""Current category is probabaly assigned to other category or made as a parent"""
if parent_slug is None:
"""In json data,when 'parent_slug' is null, means we have made this category as parent category now"""
#Here i want to update this category as root node, dynamically ?
else:
#Here i want to assign this category to other subcategory or parent category ?
#Below logic is wrong, but this is what i tried, i am using this logic now, but i want to utilize the materializerd tree logic inorder to create dynamic nodes and linking among the categories.
parent_cat_qs = Category.objects.filter(slug=parent_slug).first()
if parent_cat_qs is not None:
parent_cat_path = parent_cat_qs.path
new_path = parent_cat_path+path[-4:]
parent_cat_qs = Category.objects.filter(pk=pk).update(path=new_path)