AI 웹 개발 과정/DRF 특강

DRF 특강 | 4일차

만 기 2022. 6. 20. 16:04

 

user admin

admin을 다른 필드와 동일하게 설정할 경우 비밀번호 설정 시 평문 비밀번호로 입력되어 로그인이 불가능하다. 때문에 아래 예시와 같이 UserAdmin을 상속받아야 한다.

 

user/admin.py

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

class UserAdmin(BaseUserAdmin):
    list_display = ('id', 'username', 'fullname', 'email')
    list_display_links = ('username', )
    list_filter = ('username', )
    search_fields = ('username', 'email', )

    fieldsets = (
        ("info", {'fields': ('username', 'password', 'email', 'fullname', 'join_date',)}),
        ('Permissions', {'fields': ('is_admin', 'is_active', )}),)

    filter_horizontal = []

    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ('username', 'join_date', )
        else:
            return ('join_date', )

필드값들은 사용된 필드 값으로 수정

admin.site.register(UserAdmin) 추가

auto_now_add 같은경우 readonly_fields 로 지정해줘야함

 

 

admin 심화

from django.contrib import admin
from .models import User, UserProfile, Hobby

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

# Inline : 한 테이블에서 역참조 관계의 테이블을 같이 설정할 수 있다.
# Stackedinline은 세로로, TabularInline은 가로로
class UserProfileInline(admin.StackedInline):
    model = UserProfile

class UserAdmin(BaseUserAdmin):
    list_display = ('id', 'username', 'email')  # object 목록에 띄워줄 필드를 지정한다.
    list_display_links = ('username', )         # object 목록에서 클릭 시 상세 페이지로 들어갈 수 있는 필드를 지정한다.
    list_filter = ('username', )                # filter를 걸 수 있는 필드를 생성한다.
    search_fields = ('username', 'email', )     # 검색에 사용될 필드를 지정한다.

    fieldsets = (                               # 상세페이지에서 필드를 분류하는데 사용된다.
        ("info", {'fields': ('username', 'password', 'email', 'join_date',)}),
        ('Permissions', {'fields': ('is_admin', 'is_active', )}),)

    filter_horizontal = []

    def get_readonly_fields(self, request, obj=None):   # 상세페이지에서 읽기 전용 필드를 설정할 때 사용된다.
        if obj:
            return ('username', 'join_date', )
        else:
            return ('join_date', )

    inlines = (
            UserProfileInline,
        )

    def has_add_permission(self, request, obj=None): # 추가 권한
        return False

    def has_delete_permission(self, request, obj=None): # 삭제 권한
        return False

    def has_change_permission(self, request, obj=None): # 수정 권한
        return False


# Register your models here.
admin.site.register(User, UserAdmin)
# admin.site.register(UserManager)
admin.site.register(UserProfile)
admin.site.register(Hobby)

 

 

 

 

 

django orm 심화

 

- get, filter, exclude 를 사용해 검색 시 다양한 Field lookups 문법을 사용 할 수 있다. 언더바 두개 사용

  • contain : 특정 string 이 포함된 object 찾기
  • startswith / endswith : 특정 string 으로 시작 / 끝 나는 object 찾기
  • gt : >
  • lt : <
  • gte : >=
  • lte : <=

- Q 를 사용해 쿼리에 and, or 을 적용시킬 수 있다.

from django.db.models.query_utils import Q

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

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

 

 

** 언더바 두개 붙이는 경우

search_user = request.data.get("input_search","")

articles = ArticleModel.objects.filter(user__username__contains = search_user)
  • ArticleModel 에 외래키 관계인 user 모델 참조 할 때
  • Field lookups 문법 사용 할 때

 

 

 

views.py의 get request 에서 serializers.py 로 request 데이터 보낼 수 있음

 

user/views.py

class UserView(APIView):
    permission_classes = [permissions.IsAuthenticated] # 로그인된 사용자만

    # 사용자 정보 조회
    def get(self, request):
        user = request.user
        user_serializer = UserSerializer(user, context={"request":request}).data

 

user/serializers.py

class HobbySerializer(serializers.ModelSerializer):
    same_hobby_users = serializers.SerializerMethodField()
    def get_same_hobby_users(self,obj):

        user = self.context["request"].user

        return [user_profile.user.username for user_profile in obj.userprofile_set.exclude(user=user)]

    class Meta:
        model = HobbyModel
        fields = ["name","same_hobby_users"]

 

'AI 웹 개발 과정 > DRF 특강' 카테고리의 다른 글

DRF 복습 퀴즈  (1) 2022.06.23
DRF 특강 | 5일차  (0) 2022.06.21
DRF 특강 | 3일차  (0) 2022.06.17
DRF 특강 | 2일차  (2) 2022.06.16
DRF 특강 | 1일차  (0) 2022.06.15