Одна модель - несколько таблиц: Django ORM против SQL-запроса

Как сделать несколько таблиц с одной моделью

Я знаю, что на этот вопрос уже отвечали раньше... но около 6 лет назад и многое было раскрыто об этом.

Например, как обрабатывать миграции, панель администратора, сериализацию данных? и все CRUD методы

Я пробовал с sql запросом (я имею в виду буквальное написание sql запроса в view.py) и он работает нормально... но я хочу знать Django способ сделать это

Также, если SQL запрос предпочтительнее, чем Django ORM, пожалуйста, предложите мне лучший код, чем тот, что я пробовал раньше

Views.py

class categoryProduct(generics.GenericAPIView):

    def post(self, request):
        params = request.query_params
        stock_id = request.data.get("pharmacy_id")
        sort_by = request.data.get("sort_by")
 
        page = int(params.get("page", 1))
        per_size = params.get("per_size", 10)
        category = params.get("category")
        sub_category = params.get("sub_category")

        cursor = connection.cursor()
        query = "SELECT * FROM stock_" + str(stock_id) + " a
 JOIN product b ON a.product_id = b.id JOIN category c ON  b.category = c.id JOIN 
    sub_category d ON b.sub_category = d.id WHERE b.category=" + str(
                    category) + " AND b.sub_category=" + str(sub_category)
    
        cursor.execute(query)
        records = cursor.fetchall()
        fields = [field[0] for field in cursor.description]
        all_response = [dict(zip(fields, record)) for record in records]

        if sort_by == "price_l2h":
            all_response = sorted(all_response, key=lambda a: a['selling_price'])
        elif sort_by == "price_h2l":
            all_response = sorted(all_response, key=lambda a: a['selling_price'], reverse=True)
        elif sort_by == "name_a2z":
            all_response = sorted(all_response, key=lambda a: a['product_name'])
        elif sort_by == "name_z2a":
            all_response = sorted(all_response, key=lambda a: a['product_name'], reverse=True)
            
        paginator_object = Paginator(all_response, per_size)
        if page > paginator_object.num_pages:
            page = paginator_object.num_pages
        elif page <= 0:
            page = 1
        objects_to_page = paginator_object.page(page)

        response = []
        for instance in objects_to_page:

            c1 = dict(list(instance.items())[:5])
            temp = dict(list(instance.items())[5:])
            sc2 = dict(list(temp.items())[:3])
            temp2 = dict(list(temp.items())[3:])
            p3 = dict(list(temp2.items())[:26])
            s4 = dict(list(temp2.items())[26:])

            data = {'category': c1, 'sub_category': sc2, 'product': p3, 'stock': s4}
            response.append(data)

        return Response(
            {"status": 200, "message": "Success","data": response})
Вернуться на верх