Django 모델에서 기본 키 참조: pk vs id
·
Django
Question.objects.get(pk=1000)과 Question.objects.get(id=1000)은 Django에서 동일한 결과를 반환한다. 여기서 pk는 "primary key"의 약자로, Django 모델에서 기본 키를 참조하는 짧은 표현이다. 두 표현의 차이와 pk를 사용하는 이유는 다음과 같다:1. 명확성:pk는 모델의 기본 키를 명시적으로 나타내므로, 모델의 기본 키가 무엇인지 확실히 알 수 있다.id를 사용할 경우, id가 기본 키임을 알고 있는 경우에만 이해할 수 있다. 다른 필드명이 기본 키인 경우, id를 사용하면 혼동할 수 있다.2. 유연성:모델에서 기본 키를 id가 아닌 다른 필드로 설정했을 때도 pk를 사용할 수 있다. 예를 들어, unique_id라는 필드를 기본 키로..
Django | 쿼리셋 내 객체 수
·
Django
✨ len() 쿼리셋은 인덱스로 접근이 가능하다. -> 길이를 재는데(쿼리셋 안 객체 수를 세는데) 파이썬의 len()함수 사용 가능. 하지만 len(queryset)을 사용하면 쿼리셋의 평가가 일어난다. len(queryset)은 select * from table 을 호출한다. 이 명령은 쿼리셋 내 객체의 수만큼 쿼리를 호출한다. O(n) + 이를 저장할 O(n)의 메모리가 추가로 필요하다. ✨ count() 그래서 쿼리셋을 평가하지 않고 쿼리셋 안의 객체의 숫자만 세고싶다면 항상 count()를 사용해야 한다. queryset.count()는 SQL의 select count(*)를 호출한다. queryset.count()는 select count(*) from table 을 호출한다. -> 한번의 ..
Django | Error : you cannot alter to or from M2M fields, or add or remove through= on M2M fields
·
Django
ManyToManyField를 적용하는 모델링 수정을 하고 makemigration -> migrate를 했는데 ValueError: Cannot alter field review.Review.user_bookmarks into review.Review.user_bookmarks - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields) 이런 에러메세지가 떴다. 매니투매니 필드에 through속성을 나중에 추가하거나 지우면 안된다는 뜻 같다. 마이그레이션 파일을 열어보면 아래처럼 작성이 되어 있다. operations = [ migrations.AlterFiel..
DRF | 페이지네이션
·
Django
이렇게 작성한 리뷰 리스트 뷰에 페이지네이션을 적용하려고 한다. class ReviewListCreateAPIView(ListCreateAPIView): queryset = Review.objects.filter(is_active=True).order_by("-created_at") permission_classes = [AllowAny] # 아직 작업중이기때문에 테스트를 위해 AllowAny로 설정 def get_serializer_class(self): if self.request.method == "GET": return serializers.ReviewListSerializer if self.request.method == "POST"..
Django | models : verbose_name
·
Django
verbose name 사람이 알아보기 쉽도록 따로 지정하는 이름 verbose name 지정하기 장고에서 ForeignKey, ManyToManyField OneToOneField를 제외하고 모든 필드 타입에서 첫번째 위치 인자로 verbose name을 지정할 수 있다. 따로 지정하지 않으면 장고에서 자동으로 필드명을 이용해서 verbose name을 만든다.(_가 들어가있다면 띄어쓰기로 바꿔준다) first_name = models.CharField("person's first name", max_length=30) # verbose name: person's first name first_name = models.CharField(max_length=30) # verbose name: first ..
Django | ORM : on_delete=models.CASCADE
·
Django
장고 on_delete=models.CASCADE class Booking(TimeStampModel): ... class Meta: db_table = 'bookings' class Passenger(TimeStampModel): ... booking = models.ForeignKey('Booking', on_delete = models.CASCADE) class Meta: db_table = 'passengers' 장고에서 데이터 모델링을 할때 외래키에 cascade속성을 주면 데이터를 삭제하면 해당 데이터를 외래키로 참조하는 데이터들이 같이 삭제가 된다. In [16]: Booking.objects.all().delete() Out[16]: (2, {'bookings.Passenger': 1, '..
Django | 프로젝트 초기세팅
·
Django
가상환경 생성 프로젝트마다 독립적인 패키지 관리를 위해 가상환경을 생성한다. conda create -n 가상환경이름 python=3.9 # 파이썬 버전을 적어줘야 한다 conda activate 가상환경이름 # 활성화하면 터미널 왼쪽에 (base)가 가상환경 이름으로 바뀐다 conda env list로 가상환경 목록을 확인할 수 있다. database 생성 mysql -u root -p # root유저로 비밀번호 치고 들어가겠다 mysql> create database 데이터베이스이름 character set utf8mb4 collate utf8mb4_general_ci; # /여기까지만 해도 생성이 되고 뒤에는 옵션 # utf8:인풋타입으로 한글을 사용하려고 utf8로 지정 # mb4:한글자당 4바이..
Django | 파이썬 쉘에서 db에 있는 데이터 id값 바꾸기
·
Django
python manage.py shell 파이썬 쉘에서 +----+---------------+---------+ | id | name | menu_id | +----+---------------+---------+ | 1 | 콜드 브루 | 1 | | 2 | 블랜디드 | 1 | | 3 | 브레드 | 2 | | 4 | 케이크 | 2 | +----+---------------+---------+ +----+---------------+---------+ | id | name | menu_id | +----+---------------+---------+ | 1 | 콜드 브루 | 1 | | 2 | 블랜디드 | 1 | | 4 | 브레드 | 2 | | 5 | 케이크 | 2 | +----+--------------..
반응형