Как я могу менять значения БД из внешнего файла?

Я новичок в django поэтому плохо понимаю разные термины. Я использую сторонний графический модуль и хочу через него работать со значения в базе данных: удалять, добавлять и изменять. Другими словами я хочу запустить файл который не связан с django и html структурой получить определённое значение. Например из

from models import Artikle
a = Article.objects.get(id = 1)
show_window(a)

Мне посоветовали использовать REST API но изо специфического вопроса я не нашел нужного ответа. Я хочу работать с сайтом не только из браузера но и из моего собственного графического приложения.


Ответы (2 шт):

Автор решения: Vadim.Sharoikin

Допустим у нас есть небольшая модель с одним полем.

class Category(models.Model):
    name_category = models.CharField(verbose_name = 'Название категории', max_length = 100, null=True)

пишем сериализатор

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name_category')

дальше используем viewset из drf

from rest_framework import viewsets
from .serializers import CategorySerializer
class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()

теперь прописываем роуты, можно использовать DefaultRouter() но я прописал руками(мне так удобнее)

from .views import CategoryViewSet

urlpatterns = [
    path('api/post/', CategoryViewSet.as_view({'post':'create'})),
    path('api/get/', CategoryViewSet.as_view({'get':'list','get_queryset':'get_queryset'})),
    path('api/del/<int:pk>',  CategoryViewSet.as_view({'put':'update','get':'retrieve','delete':'destroy'})),
]

Теперь у нас есть полностью функционирующие минимальное API и мы можем выполнять все основные задачи API, т. е. Операции Create Read Update Delete (CRUD).

Теперь создаю обычный файл со скриптом Для того чтобы получить все категории пишим такой небольшой скрипт

import requests, json

url = "http://127.0.0.1:8000/api/get/"
res = requests.get(url)
pars=json.loads(res.content.decode('utf-8'))
print(pars)

Для того чтобы добавить новую запись

import requests

url = "http://127.0.0.1:8000/api/post/" 

data = {
    'name_category':'test'
}
res = requests.post(url, data=data)

Теперь для того чтобы удалить какую-нибудь запись

import requests

data_description = 10 #id записи которую хотим удалить 
url = "http://127.0.0.1:8000/api/del/" + str(data_description) 

response = requests.delete(
    url, 
)

для put запроса попробуйте написать сами)

→ Ссылка
Автор решения: dj_moon

Я вроде разобрался но ответ является слегка не точным и пришлось сверятся с другим туториалом что бы во всем разобратся Я напишу небольшой туториал того что я сделал для тех кто также туп как и я

1 Вначале нужно установить

pip install django
pip install djangorestframework

2 после создать проект

django-admin startproject myfirst

myfirst - это название проекта вы можете заменить его на свое собственное название

3 создать приложение к нему

python manage.py startapp articles

manage.py - это основной файл к котором можно отдовать команды находится рядом с проэктом

articles - это название приложения вы можите заменить его на свое собственое назвние

4 После в файле ..myfirst\settings.py найти INSTALLED_APPS и добавить

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'articles'
]

rest_framework - это подключение к djangorestframework

articles - это название приложения

5 после в ..\articles\models.py нужно прописать

from django.db import models

class Category(models.Model):
    name_category = models.CharField(verbose_name = 'Название категории', max_length = 100, null=True)

Category - это название модуля

name_category - название параметра

verbose_name - отображаемое название параметра

max_length - максимальное количество символов

6 это не обязательно но что бы увидеть изменения сразу в файле ..\articles\admin.py нужно добавить

from .models import Category
admin.site.register(Category)

7 После сделать миграцию модулей

python manage.py makemigrations
python manage.py migrate

8 После нужно создать админ пользователя

python manage.py createsuperuser

Выбрать имя пользователя, email, пароль и подтверждение пароля При наборе пароля никакие символы не будут высвечиваться

9 для проверки правильности каждого этапа нужно включать

python manage.py runserver

и зайти на сайт http://127.0.0.1:8000/admin и войти использовал имя и пароль

10 после создать файл в article\settings.py и article\urls.py

11 в файле article\settings.py написать

from rest_framework import serializers
from .models import Category
class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('id', 'name_category')
        
        

12 написать в articles\views.py следующее

from .models import Category
from rest_framework import viewsets
from .serializers import CategorySerializer

class CategoryViewSet(viewsets.ModelViewSet):
    serializer_class = CategorySerializer
    queryset = Category.objects.all()
        

13 создать url привязку для этого нужно в myfirst\urls.py добавить

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('articles.urls')),
]

А после в articles\urls.py

from django.contrib import admin
from django.urls import path, include
from . import views
from .views import CategoryViewSet

urlpatterns = [
    path('get/', CategoryViewSet.as_view({'get':'list','get_queryset':'get_queryset'})),
    path('post/', CategoryViewSet.as_view({'post':'create'})),
    path('del/<int:pk>',  CategoryViewSet.as_view({'put':'update','get':'retrieve','delete':'destroy'})),
]

14 И после создать любой независимый файл и написать

Для получения

import requests, json

url = "http://127.0.0.1:8000/api/get/"
res = requests.get(url)
pars=json.loads(res.content.decode('utf-8'))
print(pars)

Для добавления

import requests
    url = "http://127.0.0.1:8000/api/post/" 

    data = {
        'name_category':'test'
    }
    res = requests.post(url, data=data)
    

Для удаления

import requests

data_description = 10 #id записи которую хотим удалить 
url = "http://127.0.0.1:8000/api/del/" + str(data_description) 

response = requests.delete(
    url, 
)

Для обновления

import requests

data_description = 10 #id записи которую хотим изменить 
url = "http://127.0.0.1:8000/api/del/" + str(data_description) 
data = {
    'name_category':'test'
}
response = requests.put(
    url, 
    data,
)
→ Ссылка