Как я могу реализовать django Оскар "категории" функциональность (родитель, потомки) в Django Оскар RESTFUL API? - PullRequest
0 голосов
/ 11 марта 2020

В панели инструментов Оскара я могу сделать любую категорию 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...