Преобразование в SQLAlchemy из Django ORM в Django Rest Framework
У меня есть DRF-приложение. Оно написано на Django Rest Framework. Для работы с базами данных я использовал встроенный ORM Django. Позвольте мне объяснить структуру моего проекта. У меня есть проект django с именем TourReview. Внутри TourReview у меня есть приложение review. Вот мои ключевые файлы:
review/models.py :
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
# Create your models here.
class PlaceInfoModel(models.Model):
TYPE_CHOICES = [
('Beach', 'Beach'),
('Hill', 'Hill'),
('Fountain', 'Fountain'),
('Landmark', 'Landmark')
]
owner = models.ForeignKey('auth.User', related_name='review',
on_delete=models.CASCADE, default=1)
name = models.CharField(max_length=60)
address = models.CharField(max_length=300)
rating = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(5)])
type = models.CharField(max_length=20, choices=TYPE_CHOICES)
image = models.ImageField(upload_to='uploads/')
review/serializers.py:
from .models import PlaceInfoModel
from rest_framework import serializers
class PlaceInfoSerializer(serializers.ModelSerializer):
class Meta:
model = PlaceInfoModel
fields = ['id', 'name', 'address', 'rating', 'type', 'image']
read_only_fields = ['owner']
reviews/views.py:
from django.shortcuts import render
from .serializers import *
from .models import *
from rest_framework.decorators import APIView
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from .custom_permission import IsPermittedForAction
from django.contrib.auth.views import LogoutView
from .serializers import *
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.filters import OrderingFilter
class PlaceModelViewSet(viewsets.ModelViewSet):
queryset = PlaceInfoModel.objects.all()
serializer_class = PlaceInfoSerializer
authentication_classes = [SessionAuthentication]
permission_classes = [IsPermittedForAction,IsAuthenticatedOrReadOnly]
pagination_class = LimitOffsetPagination
filter_backends = [OrderingFilter]
ordering_fields = ['id','name', 'rating', 'address']
def perform_create(self, serializer):
return serializer.save(owner=self.request.user)
def perform_update(self, serializer):
return serializer.save()
# Django 5 doesn't support logout GET view from now on. So added this.
class PatchLogoutView(LogoutView):
http_method_names = ["get", "post", "options"]
def get(self, request, *args, **kwargs):
return self.post(request, *args, **kwargs)
TourReview/urls.py:
from django.contrib import admin
from django.urls import path,include
from rest_framework.routers import DefaultRouter
from review.views import PlaceModelViewSet,PatchLogoutView
from django.conf import settings
from django.conf.urls.static import static
router = DefaultRouter()
router.register('places',PlaceModelViewSet)
urlpatterns = [
path('',include(router.urls)),
path('admin/', admin.site.urls),
path("api-auth/logout/", PatchLogoutView.as_view(), name="logout"),
path("api-auth/", include("rest_framework.urls", namespace="rest_framework")),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Итак, для замены Django ORM на SQLAlchemy (где я также собираюсь использовать базу данных SQLite), я просмотрел эту документацию. Там я узнал основы SQLAlchemy. И я ожидаю, что reviw/models.py будет выглядеть примерно так:
from django.db import models
from sqlalchemy import create_engine,ForeignKey
from sqlalchemy.orm import declarative_base,sessionmaker,relationship
from sqlalchemy import Column, String, Integer,Float
from django.core.validators import MinValueValidator, MaxValueValidator
engine = create_engine('sqlite:///db.sqlite3')
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class PlaceInfoModel(Base):
__tablename__ = 'place_info'
id = Column(Integer, primary_key=True)
name = Column(String(60))
address = Column(String(300))
rating = Column(Float)
type = Column(String(20))
image = Column(String)
owner_id = Column(Integer, ForeignKey('auth_user.id'))
owner = relationship("User", back_populates="reviews")
class User(Base):
__tablename__ = 'auth_user'
id = Column(Integer, primary_key=True)
reviews = relationship("PlaceInfoModel", back_populates="owner")
Я не знаю, правильно ли это или нет. Теперь я застрял на этом этапе и не знаю, как настроить мои review/serializers.py, review/views.py и TourReview/urls.py. Я хочу заменить встроенный в django ORM на SQLAlchemy, где я все еще планирую использовать базу данных SQLite. Было бы здорово, если бы я мог сделать это поверх предыдущей версии с Django ORM.