230906_postgreSQL_4

장종민·2023년 9월 6일

mentor

목록 보기
20/24

권한설정

  • PostgreSQL 15(서버선택) > 로그인/그룹 롤 > postgres >오른쪽 클릭 및 properties선택 > 접근권한

권한

  • 슈퍼관리자 / 관리자 / 유저

DRF - PostgreSQL 연결

  • 가상환경/프로젝트(pokki) 생성

  • drf설치

    • pip install djangorestframework
  • db연결

    • settings.py > DATABASES

      • DATABASES = {
            'default': {
                'ENGINE': 		'django.db.backends.postgresql',
                'NAME': 'pokki',
                'USER': 'postgres',
                'PASSWORD': '1234',
                'HOST': 'localhost',
                'PORT': '5432'
            }
        }
      • 저장

  • gresql에서 서버 > 데이터베이스 만들기 > pokki생성

  • pip install psycopg2

  • 마이그레이션 실행

    • python manage.py makemigrations
    • python manage.py migrate
  • pokki/models.py 코드 추가

    • from django.db import models
      
      # Create your models here.
      class Company(models.Model):
          name = models.CharField(max_length=100)
      
      class Student(models.Model):
          name = models.CharField(max_length=100)
          age = models.IntegerField()
    • 마이그레이션 실행

  • pokki/serializers.py생성, 코드 추가

    • from rest_framework import serializers
      from .models import Company, Student
      
      class CompanySerializer(serializers.ModelSerializer):
          class Meta:
              model = Company
              fields = '__all__'
      
      class StudentSerializer(serializers.ModelSerializer):
          class Meta:
              model = Student
              fields = '__all__'
  • pokki/views.py 코드 추가 // 가져오기

    • from django.shortcuts import render
      from rest_framework import viewsets
      from .models import Company, Student
      from .serializers import CompanySerializer, StudentSerializer
      # Create your views here.
      
      class CompanyViewSet(viewsets.ModelViewSet):
          queryset = Company.objects.all()
          serializer_class = CompanySerializer
      
      class StudentViewSet(viewsets.ModelViewSet):
          queryset = Student.objects.all()
          serializer_class = StudentSerializer
  • pokki/urls.py 생성, 코드 추가

    • from django.urls import path, include
      from rest_framework.routers import DefaultRouter
      from .views import CompanyViewSet, StudentViewSet
      
      router = DefaultRouter()
      router.register(r'companies', CompanyViewSet)
      router.register(r'students', StudentViewSet)
      
      urlpatterns = [
          path('api', include(router.urls))
      ]
  • 프로젝트레벨/urls.py 코드 추가

    • from django.contrib import admin
      from django.urls import path, include
      
      urlpatterns = [
          path("admin/", admin.site.urls),
          path('', include('myapp.urls'))
      ]
  • 런서버후 /api/로 이동

    • python manage.py runserver

--

  • templates/add_student.html 생성, 코드 추가

    • <h1>교육생 등록</h1>
          <form method="post">
              {% csrf_token %}
              {{ form.as_p }}
              <button type="submit">등록</button>
          </form>
  • pokki/views.py 코드 추가

    • ...
      from .forms import StudentForm
      from django.shortcuts import render, redirect
      ...
      
      def student_list(request):
          students = Student.objects.all()
          return render(request, 'student_list.html', {'students': students})
      
      def add_student(request):
          if request.method == 'POST':
              form = StudentForm(request.POST)
              if form.is_valid():
                  form.save()
                  return redirect('student_list')
          else:
              form = StudentForm()
          return render(request, 'add_student.html', {'form': form})
  • pokki/forms.py 생성, 코드 추가

    • from django import forms
      from .models import Student
      
      class StudentForm(forms.ModelForm):
          class Meta:
              model = Student
              fields = ['name', 'age']
  • templates/student_list.html 생성, 코드 추가

    • <!--student_list.html-->
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <meta http-equiv="X-UA-Compatible" content="IE=edge">
          <meta name="viewport" content="width=device-width, initial-scale=1.0">
          <title>Document</title>
      </head>
      <body>
          <h1>교육생 리스트</h1>
          <ul>
              {% for student in students %}
                  <li>이름: {{student.name}} / 나이: {{student.age}}</li>
              {% endfor %}
          </ul>
          <a href="{% url 'add_student' %}">교육생 등록 페이지로 이동</a>
      </body>
      </html>
  • pokki/urls.py 코드 수정

    • from django.urls import path, include
      from rest_framework.routers import DefaultRouter
      from .views import CompanyViewSet, StudentViewSet, add_student, student_list
      
      router = DefaultRouter()
      router.register(r"companies", CompanyViewSet)
      router.register(r"students", StudentViewSet)
      
      urlpatterns = [
          path("api/", include(router.urls)),
          path("add", add_student, name="add_student"),
          path("", student_list, name="student_list"),
      ]
    • templates/add_student.html 생성, 코드 추가

      • <!-- add_student.html -->
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>Document</title>
        </head>
        <body>
            <h1>교육생 등록</h1>
            <form method="post">
                {% csrf_token %}
                {{ form.as_p }}
                <button type="submit">등록</button>
            </form>
        </body>
        </html>
    • static/css/styles.css 파일 생성, 코드 추가 및 적용

      • <% load static %>
        
        <link rel="stylesheet" type="text/css" href="{% static 'css/styles.css' %}">
    • templates/random_student.html 생성, 코드 추가

      • <h1>랜덤 교육생 결과보기</h1>
            <ul>
                <li>당첨된 교육생: {{random_student.student.name}}</li>
            </ul>
    • views.py 코드 추가

      • ...
        def random_student(request):
            students = Student.objects.all()
            random_student = random.choice(students)
            RandomStudent.objects.create(student=random_student)
            return redirect('random_student_result')
        
        def random_student_result(request):
            random_students = RandomStudent.objects.all()
            random_student = len(random_students)-1
            return render(request, "random_student.html", {'random_student': random_student})
    • models.py 코드 추가

      • ...
        class RandomStudent(models.Model):
            student = models.ForeignKey(Student, on_delete = models.CASCADE)
    • urls.py 코드 추가

      • ...
        path('random', random_student, name='random_student'),
        path('random/result', random_student_result, name='random_student_result')
profile
비전공 오르미부트캠프 2기

0개의 댓글