'django mysql modeling'에 해당되는 글 1건

  1. 2018.03.11 django mysql rest api project
  1. settings.py 설정

    • mysql 데이터베이스에 사용할 app model 의 initial.py 를 생성한다
    • $ python manage.py makemigrations
      
    • mysql 데이터베이스에 app model table 을 생성한다
    • $ python manage.py migrate
      
      # Database 설정
      DATABASES = {
        # 기본으로 default 의 database 명을 받아 DB migration 을 하게 된다
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # mysql db 를 사용한다
            'NAME': 'database1',                   # database 명
            'USER': 'testuser',                    # 사용자 id
            'PASSWORD': 'testpasswd',              # 사용자 password
            'HOST': 'localhost',                   # ip address
            'PORT': '3306',                        # port
        },
        # 멀티 데이터베이스를 사용하게 될 경우, setting
        'database2': {                             # database 명을 따라간다
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'database2',
            'USER': 'testuser',
            'PASSWORD': 'testpasswd',
            'HOST': 'localhost',
            'PORT': '3306',
        }
      }
      
      # 라우터를 통해 앱 별로 사용할 데이터 베이스를 선택하도록 한다
      DATABASE_ROUTERS = [
        # 프로젝트명.python패키지.python파일명.python클래스
        'django_multi_databases.MultiDatabasesRouter.Router',
      ]
      
  2. Router.py (선택사항)

    • 멀티 데이터베이스 사용시, default 를 사용하지 않을 app 에 대해서만
    • $ python manage.py migrate {app_name} --database={database_name}
      
      class Router(object):
        app_dictionary = {
            'app1' : 'default',
            'app2' : 'database2',
        }
      
        def db_for_read(self, model, **hints):
            return self.app_dictionary[model._meta.app_label];
      
        def db_for_write(self, model, **hints):
            return self.app_dictionary[model._meta.app_label];
      
        def allow_migrate(self, db, app_label, model_name=None, **hints):
            return True
      
  3. models.py

    • mysql 맵핑 object 생성

      # -*- coding: utf-8 -*-
      from __future__ import unicode_literals
      
      from django.db import models
      from django.utils import timezone
      
      class DB1Model(models.Model):
        # 기본적으로 primary 를 선언하지 않으면 id 라는 auto increments 컬럼이 생성된다
        title = models.CharField(max_length=255)
        content = models.TextField()
        likes = models.BigAutoField()
        lastModified = models.DateTimeField(default=timezone.now)
      
  4. Serializer.py

    • DB model 과 django 프레임워크 의 object 를 연결

      class DB1ModelSerializer(serializers.ModelSerializer):
      
        class Meta:
            model = DB1Model
            fields = ('id', 'title', 'content', 'likes, 'lastModified')
      
  5. views.py

    • django 프레임워크 에서 CRUD 하는 로직 생성

      class DB1ModelListCreateAPIView(generics.ListCreateAPIView):
        http_method_names = ['get', 'post']
      
        queryset = DB1Model.objects.all()
        serializer_class = serializers.DB1ModelSerializer
      
      class DB1ModelRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
        http_method_names = ['get', 'put', 'delete']
        serializer_class = serializers.DB1ModelSerializer
      
        def get_object(self):
            queryset = self.filter_queryset(self.get_queryset())
            filter_kwargs = {'id': self.kwargs['id']}
            model_instance = generics.get_object_or_404(queryset, **filter_kwargs)
            return model_instance
      
  6. urls.py

    • CRUD 동작 과 RESTful API 와 연결

      url(r'^/v1/dbmodel/$', views.DB1ModelListCreateAPIView.as_view(), name="api-dbmodel-lc"),
      url(r'^/v1/dbmodel/(?P<id>[^/]+)/$', views.DB1ModelRetrieveUpdateDestroyAPIView.as_view(), name="api-dbmodel-rud"),


Posted by 감각적신사
,