Django

Django 기초 4주차 2_Sparta Coding Club

끈끈 2023. 4. 5. 17:43

https://sw-ing.tistory.com/61

 

Django 기초 4주차 1_Sparta Coding Club

4주차에서 배울 것 데이터베이스 간의 관계 파악 ORM 모델 수정 Django admin 화면에서 나의 모델 확인 팔로잉 / 팔로우 모델 기능 사용 데이터베이스 관계 one-to-many 한 개의 글에는 한 명의 사용자 한

sw-ing.tistory.com

 


 

Django Shell

 

Django Shell 실행

 

python manage.py shell

 

 

django의 기능들을 코딩 없이 사용 할 수 있게 해주는 기능이다

 

shell을 통해 데이터들을 확인, 테스트 할 수 있다

 

  • 피자 모델에서 토핑 불러오기 / 토핑 모델에서 토핑을 가지고 있는 피자 가져오기
# django shell 실행
> python manage.py shell 

# 레스토랑 앱에 있는 모델 가져오기
>>> from restaurant.models import MyTopping, MyPizza 

# MyPizza 확인
>>> MyPizza.objects.all() 
<QuerySet [<MyPizza: 도미노>, <MyPizza: 피자헛>, <MyPizza: 파파존스>]>

# Pizza 하나씩 불러보기
>>> MyPizza.objects.get(pizza_name='도미노') 
<MyPizza: 도미노>

# 각 Pizza Topping 불러보기
>>> MyPizza.objects.get(pizza_name='도미노').pizza_topping.all() 
<QuerySet [<MyTopping: 치즈>, <MyTopping: 치킨>]>

# Topping 확인
>>> MyTopping.objects.all() 
<QuerySet [<MyTopping: 치즈>, <MyTopping: 페퍼로니>, <MyTopping: 올리브>, <MyTopping: 치킨>, <MyTopping: 피망>]>

# Topping 하나씩 불러보기
>>> MyTopping.objects.get(topping_name='치즈') 
<MyTopping: 치즈>

# 각 Topping 이 있는 피자 불러보기
>>> MyTopping.objects.get(topping_name='치즈').mypizza_set.all() 
<QuerySet [<MyPizza: 도미노>, <MyPizza: 피자헛>, <MyPizza: 파파존스>]>

 

pizza_nametopping_namerestaurant/models.py에 있는 값이다

 

이처럼 many-to-many 모델은 서로의 테이블에서 서로의 데이터를 불러올 수 있다는 것이 특징이다

 


 

Many-To-Many 모델 만들어보기
팔로우/팔로잉

 

user/models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.conf import settings #####

class UserModel(AbstractUser):
    class Meta:
        db_table = "my_user"

    bio = models.CharField(max_length=256, default='')
    follow = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='followee') #####

 

  • settings.AUTH_USER_MODEL / from django.conf import settings : mySpartaSns의 settings.py를 장고를 통해서 가져오는 이유는 setting 파일을 여러 개로 나눠서 적용하기 때문인데, 필요한 상황마다 장고가 알아서 settings.py 파일을 가져와서 알아서 관리해주는 좋은 기능!

 

데이터베이스에 적용시키기

python manage.py makemigrations
python manage.py migrate

 

my_user_follow

 


 

admin / UserModel

 

Follow

 


 

Many-To-Many 모델 사용하기
팔로우/팔로잉

 

user/views.py:

@login_required
def user_view(request):
    if request.method == 'GET':
        # 사용자를 불러오기, exclude와 request.user.username 를 사용해서 '로그인 한 사용자'를 제외하기
        # 내가 나를 팔로우 할 필요는 없기 때문
        user_list = UserModel.objects.all().exclude(username=request.user.username)
        return render(request, 'user/user_list.html', {'user_list': user_list})

@login_required
def user_follow(request, id):
    me = request.user
    click_user = UserModel.objects.get(id=id)
    if me in click_user.followee.all(): # user를 팔로우하는 모든 사람 중에 내가 있다면
        click_user.followee.remove(request.user)
    else:
        click_user.followee.add(request.user)
    return redirect('/user')

 

  • follow : 내가 팔로우 하는 사람
  • followee : 나를 팔로우 하는 사람

 

user/urls.py:

path('user/', views.user_view, name='user-list'),
path('user/follow/<int:id>', views.user_follow, name='user-follow'),

 

친구