@postya

Как сделать кастомный sqlite запрос в django rest?

имеется метод delete в django-rest приложении
Я делаю такой запрос в браузере DB Browser fro Sqlite и он работает:

CREATE TABLE `new_category1` (
	`id`	integer NOT NULL PRIMARY KEY AUTOINCREMENT,
	`question`	text NOT NULL,
	`answer`	text NOT NULL
);

INSERT INTO new_category1(question, answer) SELECT question, answer FROM api_category1;
DROP TABLE api_category1;
ALTER TABLE new_category1 RENAME TO api_category1;


Я попытался сделать часть запроса в среде pycharm, но он не работает:

def delete(self, request, id):
        category = self.get_object(self, id)
        category.delete()
        category.objects.raw('CREATE TABLE "new_category1" '
                             '("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, '
                             '"question" text NOT NULL, '
                             '"answer" text NOT NULL);')
        return Response(status=status.HTTP_204_NO_CONTENT)


Как сделать правильно кастомный запрос в django rest?

5f0effb1c279c420115128.jpeg
  • Вопрос задан
  • 30 просмотров
Решения вопроса 1
@postya Автор вопроса
Благодаря наводке @Dr.Bacon я сделал чистый sql запрос таким способом:

oldTableName = "api_category1"
newTableName = "new_category1"

createTable = 'CREATE TABLE {newTableName} ' \
              '(id integer NOT NULL PRIMARY KEY AUTOINCREMENT, ' \
              'question text NOT NULL, ' \
              'answer text NOT NULL);'

insertIntoTable = 'INSERT INTO {newTableName} (question, answer) SELECT question, answer FROM {oldTableName};'
dropTable = 'DROP TABLE {oldTableName};'
renameTable = 'ALTER TABLE {newTableName} RENAME TO {oldTableName};'

class Category1Details(APIView):
    @staticmethod
    def get_object(self, id):

        try:
            return Category1.objects.get(id=id)

        except Category1.DoesNotExist:
            return HttpResponse(status=status.HTTP_404_NOT_FOUND)

    def get(self, request, id):
        question = self.get_object(self, id)
        serializer = Category1Serializer(question)
        return Response(serializer.data)

    def delete(self, request, id):
        category = self.get_object(self, id)
        oldTableName = "api_category1"
        newTableName = "new_category1"
        category.delete()
        cursor = connection.cursor()
        cursor.execute(createTable.format(newTableName=newTableName))
        cursor.execute(insertIntoTable.format(newTableName=newTableName, oldTableName=oldTableName))
        cursor.execute(dropTable.format(oldTableName=oldTableName))
        cursor.execute(renameTable.format(newTableName=newTableName, oldTableName=oldTableName))
        return Response(status=status.HTTP_204_NO_CONTENT)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bacon
Если у вас там DDL запросы, то с большой вероятностью ошибка проектирования
Если это DML, то Model.objects.raw, используется если нужен маппинг данных в Django модели, а если не нужен, то https://docs.djangoproject.com/en/3.0/topics/db/sq... Про raw там же читайте, а то его тоже неправильно используете, надо не у объекта вызывать, а у класса модели https://docs.djangoproject.com/en/3.0/topics/db/sq...
Так что читайте доки, там всё есть. Ну и до того как использовать DRF, надо хорошо разобраться как работает Django
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
iDWELL Москва
от 150 000 до 210 000 ₽
iDWELL Москва
от 150 000 до 210 000 ₽
SMMplanner Москва
от 100 000 до 150 000 ₽
14 авг. 2020, в 13:46
2000 руб./за проект
14 авг. 2020, в 13:35
20000 руб./за проект