3. Django의 QuerySet 메서드 중 데이터베이스에서 특정 조건에 맞는 모든 레코드를 반환하는 메서드는 무엇인가요?

  • A) filter()
  • B) get()
  • C) exclude()
  • D) all()

정답 : A) filter()

이유: 모든 레코드를 반화하는 메서드만 있었으면 D)all()이 맞지만 앞에 특정 조건이 들어가기에 filter()가 맞다

또한 특정 한개만 조회할때에는 get()을 쓰는게 맞다

 

 

8.Django의 MTV 패턴에서 각 요소(Model, Template, View)의 역할을 간단히 설명하세요.

 

  • 나의 답
    • Model: 데이터베이스, 데이터 관리
    • Template: 사용자에 보여지는 곳
    • View: 사용자의 요청을 처리하고 응답하는 곳
  • 정답
    • Model: 데이터베이스 구조를 정의하고, 데이터를 관리하는 역할을 합니다. 데이터베이스 테이블과 매핑되며, 데이터를 저장, 조회, 수정, 삭제하는 기능을 제공합니다.
    • Template: 사용자에게 보여지는 화면을 담당합니다. HTML 파일과 같은 템플릿을 통해 데이터를 시각적으로 표현하며, 동적인 웹 페이지를 생성하는 데 사용됩니다.
    • View: 사용자의 요청을 처리하고, 적절한 데이터를 가져와서 템플릿과 결합하여 응답을 생성하는 역할을 합니다. View는 Model과 Template 사이에서 중개자 역할을 합니다.
  • 개념적으로 틀리지는 않았지만 정답에 나와있는 것처럼 조금 풀어서 설명하면 좋았을거 같다

 

9. Django에서 settings.py 파일의 주요 역할을 구체적인 예시를 들어 설명하세요.

  • 나의 답
    • 장고에서 사용할 설정 및 정적 또는 미디어 파일의 경로를 설정 할 수 있고 또한 중복된 html의 경우 따로 templates안에 만들어서 각각의 앱에서 호출 할 수 있게 경로를 잡을 수 있습니다
  • 정답
    • settings.py 파일은 Django 프로젝트의 설정을 관리하는 파일입니다. 데이터베이스 설정, 설치된 앱, 미들웨어, 정적 파일 경로, 템플릿 설정, 국제화 설정, 보안 키 등의 다양한 프로젝트 설정이 이 파일에 포함됩니다. 프로젝트 전반의 동작을 조정하고, 필요한 외부 리소스나 라이브러리를 연결하는 역할을 합니다.

10. Django ORM이란 무엇이며, 왜 사용하는지 설명하세요.

  • 나의답
    • 데이터 베이스를 생성및 수정 삭제를 조금더 간편하게 하여 개발자가 SQL에 쏟을 시간을 절약하여 필요한 비지니스코드에 좀더 집중 하게 만들어 줍니다.
  • 정답
    • **Django ORM(Object-Relational Mapping)**은 Python 객체를 데이터베이스의 테이블과 매핑하여 데이터베이스 조작을 간단하고 직관적으로 수행할 수 있게 해주는 도구입니다. SQL 쿼리를 작성하지 않고도 Python 코드만으로 데이터베이스와 상호 작용할 수 있게 해줍니다. 이를 통해 데이터베이스 독립성을 유지할 수 있으며, 데이터베이스 작업을 더 안전하고 효율적으로 수행할 수 있습니다.

11. Django의 Custom UserModel을 사용하는 이유와 장점을 설명하세요.

  • 나의답
    • 장고에 기본적으로 사용되는 UserModel에는 딱 필요한 부분만 있기에 제작하고 있는 UserModel에 필요한 부분을 추가하기 위하여 Coustom UserModel을 사용합니다.
  • 정답
    • Django의 기본 User 모델을 사용하는 대신 Custom UserModel을 사용하면, 사용자 모델을 확장하거나 수정할 수 있어 프로젝트의 요구사항에 맞게 사용자 정보를 관리할 수 있습니다. 예를 들어, 추가적인 사용자 필드가 필요하거나 로그인 방식(예: 이메일로 로그인)을 변경하고 싶을 때 유용합니다. Custom UserModel을 사용하면 향후 확장성도 더 좋아지고, 프로젝트 시작 시 이러한 커스터마이징을 도입하면 나중에 구조 변경이 필요할 때 발생할 수 있는 문제를 예방할 수 있습니다.

12. Django에서 Model 클래스는 데이터베이스 테이블과 매핑됩니다. Django ORM에서 모델을 정의할 때 필드를 정의할 수 있는 다양한 옵션 중 ManyToManyField에 대해 구체적인 사용 사례를 들어 설명하세요.

  • 나의답
    • 해시 태그의 경우 내가 쓴 글에만 적용되는것 이아닌 다른 글에도 적용이 가능하기에 해시태그 테이블과 제품(또는 게시글)과 ManyToMany가 됩니다.
  • 정답
    • Django의 ManyToMany는 두 모델간의 다대다 관계를 정의할 때 사용됩니다. 다대다 관계란 한 모델의 여러 인스턴스가 다른 모델의 여러 인스턴스와 연결될 수 있는 경우를 말합니다. 예를 들어, 하나의 학생이 여러 과목을 수강할 수 있고, 동시에 하나의 과목을 여러 학생이 수강할 수 있는 상황이 있을 수 있습니다.
    • Django는 이러한 관계를 처리하기 위해 자동으로 중간 테이블을 생성하며 이 테이블에는 두 모델의 외래 키가 저장되어 있습니다.

14. Django 모델을 작성하세요. "BlogPost"라는 이름의 모델을 만들고, 제목(title), 내용(content), 작성일(created_at), 수정일(updated_at) 필드를 추가하세요.

  • 제목은 문자열(CharField), 내용은 텍스트(TextField), 작성일과 수정일은 날짜/시간(DateTimeField) 필드로 정의합니다.
  • created_at과 updated_at 필드는 각각 자동으로 생성되도록 설정하세요.
  • 나의 답
  • class BlogPost(models.Model):
        title = models.CharField(max_length=120)
        content = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at  = models.DateTimeField(auto_now=True)
  • 정답
  • from django.db import models
    
    class BlogPost(models.Model):
        title = models.CharField(max_length=200)
        content = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.title

 

14. Django에서 사용자가 로그인할 수 있는 간단한 로그인 뷰를 작성하세요.

  • 사용자가 로그인 폼을 제출했을 때, 해당 사용자를 인증하고, 성공적으로 로그인할 경우 'home' 페이지로 리디렉션합니다.
  • 로그인 실패 시 다시 로그인 페이지로 리디렉션하며, 실패 메시지를 출력하세요.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        
        # 이곳에 코드를 작성해 주세요.
        
    return render(request, 'login.html')

 

정답

더보기
# 내가 찾은 정답
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login_view(request):
	context = {}
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        
        # 이곳에 코드를 작성해 주세요.
        userObject = authenticate(username = username, password = password)
        if userObject is not None:
        	login(request, userObject)
            return redirect("home")
        context = {
        	"error": "fail"
        }
        
    return render(request, 'login.html', context)
    
# 캠프에서 제공한 정답
답안
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login

def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            messages.error(request, 'Invalid username or password')
            return redirect('login')
    return render(request, 'login.html')

 

내가 찾은 정답코드는 context라는 값을 통해 다시 login.html쪽으로 값을 전달 하여 html쪽에서 오류메시지를 처리하는 데 비해 캠프에서 제공한 정답코드를 보니 messages를 통해 값을 쉽게 전달하였다. 그런데 검색해보니 messages를 쓸려면 상단 form django.contrib import messages를 선언 해주어야 한다

 

문제에서 요구하는 사항으로 뒤에 messages 또는 context를 이용하는 것은 개발자의 자유로 보인다. 여기서 문제는 authenticate의 사용법을 아는가 모르는가로 나뉘는 부분이라 이부분은 확실히 알아 두는게 좋을 거 같다

 

15. 다음의 Post에 대해 CRUD를 하는 코드의 일부입니다. 아래 내용을 참고하여 코드를 완성해 주세요.

Post 모델은 다음과 같은 필드를 가진다고 가정합니다.

  • title: CharField(max_length=100)
  • content: TextField()
  • created_at: DateTimeField(auto_now_add=True)

15 - 1. Read

  • 내코드
  • def post_list(request):
        posts = Post.objects.all()
        context = {'posts': posts}
        return render(request, 'posts/index.html', context)
  • 정답코드
  • def post_list(request):
        posts = Post.objects.all()
        return render(request, 'posts/index.html', {'posts': posts})

15 - 2. Create

  • 내코드
  • def post_create(request):
        if request.method == 'POST':
            form = PostForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('post_list')
        else:
            form = PostForm()
        return render(request, 'posts/form.html')
  • 정답코드
  • def post_create(request):
        if request.method == 'POST':
            form = PostForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('post_list')
        else:
            form = PostForm()
        return render(request, 'posts/form.html', {'form': form})

15 - 3. Update

  • 내코드
  •  
  • def post_update(request, post_id): post = Post.objects.filter(pk=post_id) if request.method == 'POST': form = PostForm(request.POST, instance=post) if form.is_valid(): form.save() return redirect('post_list') else: form = PostForm(instance=post) return render(request, 'posts/form.html', {'form': form})
  • 정답코드
  • def post_update(request, post_id):
        post = get_object_or_404(Post, pk=post_id) # 모두 정답
        post = get_object_or_404(Post, id=post_id) # 모두 정답
        post = Post.objects.get(pk=post_id) # 모두 정답
        post = Post.objects.get(id=post_id) # 모두 정답
        if request.method == 'POST':
            form = PostForm(request.POST, instance=post)
            if form.is_valid():
                form.save()
                return redirect('post_list')
        else:
            form = PostForm(instance=post)
        return render(request, 'posts/form.html', {'form': form})

15 - 4. Delete

  • 내코드
  • def post_delete(request, post_id):
        post = Post.objects.filter(pk=post_id)
        if request.method == 'POST':
            post.delete()
            return redirect('post_list')
        return render(request, 'posts/confirm_delete.html', {'post': post})
  • 정답코드
  • def post_delete(request, post_id):
        post = get_object_or_404(Post, pk=post_id) # 모두 정답
        post = get_object_or_404(Post, id=post_id) # 모두 정답
        post = Post.objects.get(pk=post_id) # 모두 정답
        post = Post.objects.get(id=post_id) # 모두 정답
        if request.method == 'POST':
            post.delete()
            return redirect('post_list')
        return render(request, 'posts/confirm_delete.html', {'post': post})

'기타' 카테고리의 다른 글

공공 API 연동 하기  (1) 2024.09.30
LLM - LangChain  (3) 2024.09.21
git branch 생성 방법 및 상태  (0) 2024.08.27
전문반 숙제) 논문을 읽고 난 후  (0) 2024.08.26
Git Pull requests 하기 위하여  (0) 2024.08.23

+ Recent posts