코딩일지/TIL: Today I Learned

20221027 TIL

야언 2022. 10. 27. 19:06

오늘의 배운 것

  • 장고 심화 - 4주차 프로젝트 마무리 | 5주차 테스트 코드

 

 

장고 심화

 

 

  • profile, feed 페이지 생성

 

profile

 

users - urls.py

urlpatterns = [
	..
    path('<int:user_id>/', views.ProfileView.as_view(), name='profile_view'),
	..
]

 

users - models.py

class User(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    followings = models.ManyToManyField('self', symmetrical=False, related_name='followers', blank=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    USERNAME_FIELD = 'email'

    def __str__(self):
        return self.email

 

users - views.py

class ProfileView(APIView):
    def get(self, request, user_id):
        user = get_object_or_404(User, id=user_id)
        serializer = UserProfileSerializer(user)
        
        return Response(serializer.data)

 

users - serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    # followers = serializers.PrimaryKeyRelatedField(many=True, read_only=True)  # 팔로워 숫자(id)로 표시
    followers = serializers.StringRelatedField(many=True)  # 팔로워 str(__str__ 설정상 email)로 표시
    followings = serializers.StringRelatedField(many=True)
    article_set = ArticleListSerializer(many=True)
    like_articles = ArticleListSerializer(many=True)
    class Meta:
        model = User
        fields = ("id", "email", "followings", "followers", "article_set", "like_articles", )

 

프로필용 시리얼라이저를 추가해 필드에 원하는 항목들 만들어서 띄우기

 

** StringRelatedField를 통해  followers, followings 유저를 self.email 형태(__str__(self) 함수)로 받아올 수 있다!

 

 

feed

 

articles - urls.py

urlpatterns = [
	..
	path('feed/', views.FeedView.as_view(), name='feed_view'),
	..
]

 

articles - views.py

from django.db.models.query_utils import Q


class FeedView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    def get(self, request):
        q = Q()
        for user in request.user.followings.all():
            q.add(Q(user=user),q.OR)
        feeds = Article.objects.filter(q)
        serializer = ArticleListSerializer(feeds, many=True)
        return Response(serializer.data)

시리얼라이저는 ArticleListSerializer를 활용.

 

** Q 모듈을 사용해 쿼리에 and, or을 적용시켜 원하는 정보 가져오기

from django.db.models.query_utils import Q

class UserView(APIView)
    def get(self, request):
        # 취미 중 산책이 있거나 나이가 19살보다 많고 김씨인 사람만 필터 사람만 필터
        query = Q(hobby__name="산책") | Q(age__gt=19, user__name__startswith="김")

        # 취미 중 산책이 있으면서 나이가 19살보다 많은 사람만 필터
        query = Q(hobby__name="산책") & Q(age__gt=19)				
        user_profile_list = UserProfileModel.objects.filter(query)

 

 

 

  • ** ManyToManyField 역참조시 related_name 활용

 

sns프로젝트때도 팔로워 기능을 쓸 때 사용했지만 확실하게 짚고 넘어가서 애매했던 개념을 확실하게 잡는 시간이였다.

 

 

 

 

 

테스트 코드 활용하기 - test.py

 

지금까지는 코드를 작성해오면서 직접 웹페이지 상에서 간단하게 작동을 테스트해보거나, 포스트맨을 통해서 요청하는 방식으로 테스트를 진행해 왔다.

하지만 장고에서 지원하는 테스트 클라이언트를 통해 더욱 전문적으로 작성한 코드를 테스트하며 관리할 수 있는 방법이 있었다! 

 

 

https://docs.djangoproject.com/ko/4.1/intro/tutorial05/

 

첫 번째 장고 앱 작성하기, part 5 | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code

docs.djangoproject.com

 

 

 

 

  • 초기 설정 - def setUpTestData(cls) / def setUp(self)
  • test.py에 임시 이미지파일 생성 및 전송
  • @classmethod / @staticmethod
  • 랜덤한 가짜 더미 데이터 생성하기 - faker 모듈

https://faker.readthedocs.io/en/master/

 

Welcome to Faker’s documentation! — Faker 15.1.1 documentation

Faker is a Python package that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in your persistence to stress test it, or anonymize data taken from a production service, Faker is for you. Com

faker.readthedocs.io

 

패키지 설치

$ pip install Faker

faker 임포트하기

from faker import Faker

faker 항목

from faker import Faker

faker = Faker()
# faker = Faker(ko_KR)  # 한글도 가능

print(faker.name())  # 가짜 이름
print(faker.first_name())  # 가짜 이름
print(faker.last_name())  # 가짜 성씨
print(faker.word())  # 아무말 대잔치
print(faker.sentence())  # 아무말 대잔치
print(faker.text())  # 아무말 대잔치
print(faker.paragraph())  # 아무말 대잔치
print(faker.adrress())  # 가짜 주소
print(faker.ipv4_private())  # 가짜 ip주소
prtin(faker.profile(ko_KR))  # 가짜 유저 프로필(한글지원)
'''
{'job': '광석 및 석제품 가공기 조작원', 'company': '(주) 이', 'ssn': '690002-2669541', 'residence': '부산광역시 중구 가락68로 (지우김박리)', 'current_location': (Decimal('15.3446765blood_group': 'AB-', 'website': ['http://www.yu.com/'], 'username': 'baghyeonu', 'name': '김정수', 'sex': 'M', 'address': '울산광역시 영등포구 선릉거리', 'mail': 'ajeong@dreamwiz.co date(1960, 8, 25)}
'''

등등 여러 무작위 더미 데이터를 만들 때 유용하게 쓰는 모델이니 자주 사용하게 될 것 같다