전달받은 모델의 객체 목록이다.
쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있다.
객체(클래스)와 관계(관계형 데이터 베이스)와의 설정을 의미한다.
객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용하는데 여기서 객체 모델과 관계형 모델간에 불일치가 존재한다. 이 객체간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결 하는 것이 ORM이다.
Object <= 매핑 => DB데이터 에서 매핑의 역할을 하는 것이 ORM이라 할 수 있다.
# models.py
class User(models.Model):
name = models.CharField(max_length=50)
password = models.CharField(max_length=300)
city = models.CharField(max_length = 50)
created_at = models.DateTimeField(auto_now_add=True)
# views.py
class UserView(View):
def post(self, request)
data = json.loads(request.body)
User(
name = data["name"],
password = data["password"]
).save()
data = User.objects.all()
print(data)
# <QuerySet [<Users: Users object (1)>, <Users: Users object (2)>]>
# 사용할 땐 data[0]["name"]
data = User.objects.get(name="Tim")
try:
return User.objects.get(id=1)
execpt User.DoesNotExist:
message = "유저가 존재하지 않습니다"
execpt User.MultipleObjectsReturned:
message = "여러개의 객체가 반환되었습니다."
from django.db.models import Q # or을 사용하기 위해서는 Q를 import해줘야함.
User.objects.filter(name='John')
User.objects.filter(name='John', city="seoul") # and
User.objects.filter(Q(city="seoul") | Q(city="jeju")) # or
User.objects.exclude(city="seoul", email__endswith="naver.com") # and
User.objects.exclude(city="seoul").exclude(city="jeju")
User.objects.first()
User.objects.last()
flat
을 사용하면 tuple형태가 아닌 list형태로 가져올 수 있음User.objects.values_list('name', 'city')
# <QuerySet [('cindy', 'seoul'), ('Tim', 'jeju')]>
User.objects.values_list('name')
# <QuerySet ['cindy', 'Tim']>
User.objects.filter(city="seoul").distinct()
,
를 사용하여 여러 조건 기입 가능User.objects.order_by('-created_at') # 최신순
User.objects.order_by('name') # 이름순
모델클래스에 Meta 속성으로 ordering 지정
# models.py
class User(models.Model):
name = models.CharField(max_length=50)
password = models.CharField(max_length=300)
city = models.CharField(max_length = 50)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['id'] // 역순 시 [-id]
데이터를 불러와 속성을 변경한 후 save함수를 호출하여 저장
data = User.objects.get(id=1)
print(data.name) # ‘cindy’
data.name = ‘jain’
data.save() # save를 호출해야 실제로 저장됨
data = User.objects.all()
for user in data:
user.city = 'korea'
user.save() # 각 Model Instance 별로 DB에 update 요청 - 성능저하
하나의 sql로 작동하므로, 동작이 빠름
queryset = User.objects.all()
queryset.update(city='korea') # 일괄 update 요청
User.objects.create(name='Tim', password='#$%SF@', city='seoul')
# 기존에 있던 객체를 토대로 내용 넣기
city = User.objects.get(id=1)
User.objects.create(name='Tim', password='dfivk1', city=city)
Users.objects.all().count() # 10
Users(nickname='jin', password='123df', email='jin@naver.com').save()
Users.objects.all().count() # 11
a = Users()
a.nickname = 'rm'
a.password = 'tjdnf'
a.email = 'namjoon@naver.com'
a.save()
Users.objects.all().count() # 12
ON DELETE CASCADE
를 모방한다. 즉, 삭제 될 객체를 가리키는 외래키가 있는 객체도 함께(CASCADE) 삭제된다.(삭제된 객체 수, {pk가 걸려 있는 모델: 삭제된 객체수, ...})
Users.objects.filter(name='Tim').delete()
(1, {'user.Users': 1})
User.objects.exclude(email__endswith="naver.com").delete()
(16, {'product.Orders': 0, 'product.ProductReviews': 2, 'product.ProductAnswers': 1, 'product.UserLikeProducts': 3, 'product.ProductQuestions': 4, 'user.User': 6})
count()
는 SELECT COUNT(*)
를 수행하므로, 모든 레코드를 파이썬 객체에 로드하고 len()
를 호출하는 것보다는 count()
를 사용하는게 더 빠르다.(객체를 메모리에 로드하지 않을 때는 len()이 더 빠르다.)User.objects.filter(city='seoul').count()
최소한 하나의 row가 존재하는지의 여부를 true/false로 반환
check = User.objects.filter(name='John')
check.exists() # True
필드명__조건 = 조건값
# ex
User.objects.filter(name__icontains = 'Jo')
조건 | 내용 |
---|---|
exact / iexact | 정확히 같은 데이터를 탐색 / +대소문자 무시 |
contains / icontains | 지정한 문자열을 포함하는 데이터 탐색 / +대소문자 무시 |
startswith / istartswith | 지정한 문자열로 시작하는 데이터 탐색 / +대소문자 무시 |
endswith / iendswith | 지정한 문자열로 끝나는 데이터 탐색 / +대소문자 무시 |
in | 리스트나 튜플 자료형이 있는 값들에 해당하는 데이터 탐색 |
필드명__조건 = 조건값
# ex
User.objects.filter(created_at__lt = date(2010,1,1))
조건 | 내용 |
---|---|
gt | (=grater than) 필드명 > 조건값 |
gte | (=grater than equal) 필드명 >= 조건값 |
lt | (=less than) 필드명 < 조건값 |
lte | (=less than equal) 필드명 =< 조건값 |
참고
https://kimdoky.github.io/django/2020/02/03/django-queryset-api/