Skocz do zawartości
PL
Szukaj na Pecetowiczu
  • Utwórz konto

Django/Rest framework - Zapisywanie serializera do innej bazy niż domyślna


Rekomendowane odpowiedzi

Witam, otóż już nie mogę dojść w czym jest problem.

Mam taki kod:

serializers.py

from rest_framework import serializers
from .models import Custom_ChatColors

class JBCCCSerializer(serializers.ModelSerializer):
    class Meta:
        model = Custom_ChatColors
        fields = '__all__'

    def create(self, validated_data):
        return Custom_ChatColors.objects.db_manager('jb_db').create(**validated_data)

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from django.http import Http404

from jailbreak.models import Custom_ChatColors
from .serializers import JBCCCSerializer

class JBCCCList(APIView):

    def get(self, request, format=None):
        ccc = Custom_ChatColors.objects.db_manager('jb_db').all()
        serializer = JBCCCSerializer(ccc, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = JBCCCSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

i gdy próbuje dodać nowy wpis to wywala błąd, że nie ma tabeli w domyślnej bazie danych a ja chciałbym, żeby pobierało ja z bazy o nazwe 'jb_db'.

router.py

class JailBreakRouter:
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'jailbreak':
            return 'jb_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'jailbreak':
            return 'jb_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj._meta.app_label == 'jailbreak' or \ obj2._meta.app_label == 'jailbreak':
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'jailbreak':
            return db == 'jb_db'
        return None

I settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'portal',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost'
    },
    'jb_db': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'jailbreak',
        'USER': 'root',
        'PASSWORD': '',
        'HOST': 'localhost'
    }
}

DATABASES_ROUTERS = ['jailbreak.router.JailBreakRouter',]
Odnośnik do komentarza
Udostępnij na innych stronach

Kontynuuj dyskusję

Dołącz do Pecetowicza, aby kontynuować dyskusję w tym wątku.

  • Dodaj nową pozycję...
  • Dodaj nową pozycję...