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 |