오늘의 배운 것
- 장고 심화 - 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/
- 초기 설정 - def setUpTestData(cls) / def setUp(self)
- test.py에 임시 이미지파일 생성 및 전송
- @classmethod / @staticmethod
- 랜덤한 가짜 더미 데이터 생성하기 - faker 모듈
https://faker.readthedocs.io/en/master/
패키지 설치
$ 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)}
'''
등등 여러 무작위 더미 데이터를 만들 때 유용하게 쓰는 모델이니 자주 사용하게 될 것 같다