django orm 요약 - 질의 결과의 대소문자 구분 문제 해결

디렉터리 1.1.1 생성 쿼리 1.1.2 작성 객체 1.1.3 변경 사항 저장 1.1.4 ForeignKey와 ManyToManyField 필드 저장 1.1.5 검색 대상 1.1.6 모든 객체 검색 1.1.7 검색 특정 객체 검색 1.1.8 링크 필터 1.1.9 필터 결과집은 유일한 1.2.1 결과집은 지연 1.2.2 기타 QuerySet 방법 1.3 제한 QuerySets1입니다.2.4 필드 찾기 1.2.5 크로스 관계 조회 1.2.6 필터 모델 필드 1.2.7 캐시 조회 집합 1.2.8 비교 대상 1.2.9 삭제 대상 1.3.1 한 번에 여러 대상 수정 1.3.2 관계 대상 1.3.3 One-to-many 관계 1.3.4 Many-to-many 관계 1.3.5 One-to-one 관계
1.1.1 조회를 생성하면 데이터 모델을 만들고django는 자동으로 데이터베이스에 추상적인 API를 제공합니다. 대상을 만들고, 얻고, 수정하고, 삭제할 수 있습니다. 이 문서에서는 API를 어떻게 사용하는지 설명합니다.다음 모델, weblog 참조:
# class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()    def __unicode__(self):        return self.name# class Author(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField()    def __unicode__(self):        return self.name# class Entry(models.Model):
    blog = models.ForeignKey(Blog)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateTimeField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()    def __unicode__(self):        return self.headline

 
1.1.2 객체 만들기
python 대상으로 데이터베이스 테이블의 데이터를 묘사하고,django는 직관적인 시스템을 사용하며,하나의 모델 클래스는 하나의 데이터 테이블,하나의 클래스의 실례 설명 테이블의 상세한 기록을 묘사한다.모델의save() 방법을 사용하여 대상을 데이터베이스에 생성합니다.
from mysite.blog.models import Blog

b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()

save 방법을 실행할 때만django는 sql를 실행하여 대상을 데이터베이스에 기록합니다.
1.1.3 수정된 객체 저장
변경 사항을 저장하려면save () 방법을 사용하십시오
b5.name = 'New name'b5.save()

1.1.4 ForeignKey 및 ManyToManyField 필드 저장
cheese_blog = Blog.objects.get(name=== Author.objects.create(name=

1.1.5 검색 대상은 데이터베이스에서 검색 대상이고 모델의 관리자를 통해QuerySet을 구축할 수 있다. 하나의QuerySet은 하나의 데이터베이스에서 대상의 결합을 나타낸다. 그는 0개의 필터 조건을 가지고 SQL에서QuerySet은 select 문장을where나limit으로 필터하는 것과 같다.모형의 관리자를 통해QuerySet을 얻을 수 있습니다. 모형마다 최소한 하나의 관리자가 있습니다
1.1.6 모든 객체 검색
테이블에 있는 모든 데이터를 검색하는 가장 간단한 방법은 all () 이다.
all_entries = Entry.objects.all()

1.1.7 특정 객체 검색 필터링
검색은 특정한 검색 결과를 필터하는 두 가지 방법이 있다.filter(**kwargs)가 새로운 일치하는 검색 매개 변수를 되돌려준QuerySet exclude(**kwargs)가 새로운 일치하지 않는 검색 매개 변수를 되돌려준QuerySet
Entry.objects.filter(pub_date__year=2006)

1.1.8 링크 필터
Entry.objects.filter(headline__startswith='What')
         .exclude(pub_date__gte=datetime.now())
         .filter(pub_date__gte=datetime(2005, 1, 1))

1.1.9 필터 결과 집합은 유일
 QuerySet, , 。 , 
q1 = Entry.objects.filter(headline__startswith="What")
q2 = q1.exclude(pub_date__gte=datetime.now())
q3 = q1.filter(pub_date__gte=datetime.now())

세 개의QuerySets는 분리되어 있는데, 첫 번째는headline이'What'단어로 시작하는 결과집이고, 두 번째는 첫 번째 서브집합, 즉pubdate는 지금보다 크지 않습니다. 세 번째는 첫 번째 서브집합,pub날짜가 지금보다 크다
1.2.1 결과집은 딜레이입니다.
QuerySets는 지연됩니다. QuerySets를 만드는 것은 데이터베이스 작업에 닿지 않습니다. 여러 개의 필터를 합쳐서 값을 구할 때까지django가 조회를 시작할 수 있습니다.예:
q = Entry.objects.filter(headline__startswith="What")
q = q.filter(pub_date__lte=datetime.now())
q = q.exclude(body_text__icontains="food")print q

세 가지 필터 조건이 실행된 것처럼 보이지만, 실제로 printq를 마지막으로 실행할 때,django는 SQL을 데이터베이스에 실행하는 것을 조회하기 시작했다.
1.2.2 다른QuerySet 방법은 대부분 all(), Filter(), exclude()를 사용합니다
1.2.3 제한QuerySets
python의 그룹 제한 문법을 사용하여QuerySet을 제한합니다. 예를 들어, 처음 5개를 가져옵니다.
Entry.objects.all()[:5]

 
다섯 번째부터 열 번째까지.
Entry.objects.all()[5:10]

 
일반적으로QuerySet이 새로운QuerySet으로 되돌아오는 것을 제한합니다. "step"인자를 사용하지 않으면 즉시 값을 구하지 않습니다.
Entry.objects.all()[:10:2]
Entry.objects.order_by('headline')[0]
Entry.objects.order_by('headline')[0:1].get()

1.2.4 필드 찾기
필드 검색은 SQL 문장을 지정하는 WHERE 조건 종문입니다.QuerySet의 방법으로 Filter (), exclude (), get () 을 통해 검색 키워드를 지정합니다.기본 질의 필드lookuptype=value 예:
Entry.objects.filter(pub_date__lte='2006-01-01')

SQL로 변환하기
SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';

잘못된 인자를 보내면 이상을 던집니다
 
데이터베이스 API는 몇 가지 조회 유형을 지원하는데, 다음은 다음과 같다: a, exact
Entry.objects.get(headline__exact="Man bites dog")

... 과 같다
SELECT ... WHERE headline = 'Man bites dog';

질의에 이중 밑줄이 없는 경우 기본값exact=
Blog.objects.get(id__exact=14) # Explicit formBlog.objects.get(id=14) # __exact is implied

b, iexact - 대소문자 무시
Blog.objects.get(name__iexact="beatles blog")

blog title은 "Beatles Blog", "beatles blog", "Beatles blog", "Beatles blog"까지 일치합니다.
c,contains - 쿼리 포함, 대소문자 구분
Entry.objects.get(headline__contains='Lennon')

SQL로 전환
SELECT ... WHERE headline LIKE '%Lennon%';

icontains는 대소문자를 구분하지 않습니다
startswith,endswith,istartswith,iendswith 전 모호 일치,후 모호 일치
정렬 항목의 대소문자가 민감해야 하는지에 대해 Django는 설정 방법을 제공하지 않았습니다. 이것은 백엔드의 데이터베이스가 정렬 대소문자를 어떻게 처리하는지에 달려 있습니다.mysql 정렬 규칙 중,utf8general_ci는 대소문자를 구분하지 않음,utf8-bin,utf8general_cs는 대소문자를 구분합니다.
1.2.5 크로스 관계 조회
Entry.objects.filter(blog__name__exact='Beatles Blog')

이것은 네가 원하는 깊이를 뛰어넘을 수 있다.
역방향 크로스 관계 조회
Blog.objects.filter(entry__headline__contains='Lennon')

만약에 다중 관계 조회를 뛰어넘을 때 중간 모델에 값이 없으면django는 공으로 대처하여 이상이 발생하지 않습니다.
Blog.objects.filter(entry__author__name='Lennon');
Blog.objects.filter(entry__author__name__isnull=True);
Blog.objects.filter(
entry__author__isnull=False,
entry__author__name__isnull=True);

1.2.6 모델 필드 참조
현재 주어진 예에서 우리는 모델 필드 값과 고정된 값을 비교하는 필터를 만들었지만, 만약 우리가 같은 모델의 한 손가락과 다른 필드의 값을 비교하고 싶다면,django는 F () 를 제공한다. 대상의 특정한 열 값을 전문적으로 추출하는 작업
from django.db.models import F
Entry.objects.filter(n_pingbacks__lt=F('n_comments'))

주:npingbacks、n_comments는 모델에 대한 Entry 속성입니다.
django는 가감 곱셈과 모드 계산을 지원합니다
Entry.objects.filter(n_pingbacks__lt=F('n_comments') * 2) 
Entry.objects.filter(rating__lt=F('n_comments') + F('n_pingbacks')) 
Entry.objects.filter(author__name=F('blog__name'))

 
주 키 조회 지름길
Blog.objects.get(id__exact=14) # Explicit formBlog.objects.get(id=14) # __exact is impliedBlog.objects.get(pk=14) # pk implies id__exact

 
뿐만 아니라exact 쿼리
# Get blogs entries with id 1, 4 and 7Blog.objects.filter(pk__in=[1,4,7])# Get all blog entries with id > 14Blog.objects.filter(pk__gt=14)

 
쿼리 건너뛰기
Entry.objects.filter(blog__id__exact=3) # Explicit formEntry.objects.filter(blog__id=3) # __exact is impliedEntry.objects.filter(blog__pk=3) # __pk implies __id__exact

 
like 문장 전의 백분호
Entry.objects.filter(headline__contains='%')

전의하다
SELECT ... WHERE headline LIKE '%\%%';

1.2.7 캐시 쿼리 세트
모든 QuerySet에는 데이터베이스에 대한 접근을 최소화하기 위해 캐시가 포함되어 있습니다.그의 작업 원리를 이해하는 것은 매우 중요하기 때문에 가장 효율적인 코드를 쓸 수 있다.최근에 생성된 QuerySet에서 캐시가 비어 있습니다.첫 번째QuerySet에서 값을 얻었기 때문에 데이터베이스 조회가 발생하고django는 조회 결과를 캐시에 넣고 요청에 되돌려줍니다. 다음 조회 값은 캐시에 있는 결과를 다시 사용합니다.검색 캐시를 정확하게 사용하지 않으면 문제가 생길 수 있으므로 캐시를 유지하는 습관을 가져라.예를 들어 다음 예에서 두 개의 QuerySet을 만들 것이다
print [e.headline for e in Entry.objects.all()]print [e.pub_date for e in Entry.objects.all()]

이렇게 하면 데이터베이스 조회가 두 번 실행되고 실제 두 번 데이터베이스가 불러온다는 것을 의미한다
이 문제를 피하기 위해QuerySet 재사용을 간단하게 저장합니다
queryset = Poll.objects.all()print [p.headline for p in queryset] # Evaluate the query set.print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.

1.2.8 비교 대상
두 모델의 실례를 비교하고python 표준의 연산자를 사용하며 두 개의 등호==
some_entry == other_entry
some_entry.id == other_entry.id
some_obj == other_obj
some_obj.name == other_obj.name

1.2.9 객체 삭제
삭제 방법은 매우 편리합니다. 방법은 delete () 이고, 이 방법은 대상이 되돌아오지 않는 값을 직접 삭제합니다
e.delete()

너도 대상을 대량으로 삭제할 수 있다. 모든QuerySet에는 delete () 방법이 있는데, QuerySet의 모든 대상을 삭제할 수 있다
1.3.1 한 번에 여러 객체 수정
때로는QuerySet의 모든 대상의 한 필드에 특정한 값을 부여하고 싶을 때가 있습니다. 예를 들어 업데이트 () 방법을 사용할 수 있습니다.
# Update all the headlines with pub_date in 2007.Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')

 
이 방법은 관련 필드와 외부 키만 사용할 수 있습니다
b = Blog.objects.get(pk=1)# Change every Entry so that it belongs to this Blog.Entry.objects.all().update(blog=b)

 
업데이트 () 방법은 어떤 값도 되돌려주지 않습니다.QuerySet은save 방법을 지원하지 않습니다.save를 실행하려면 다음과 같습니다.
for item in my_queryset:
item.save()

 
업데이트에서 F() 사용 가능
# THIS WILL RAISE A FieldErrorEntry.objects.update(headline=F('blog__name'))

 
1.3.2 관계 대상
모델에서 관계를 정의할 때, 모델 실례는 관계 대상에 접근하기 편리한 API를 가지고 있습니다.이 페이지의 모형을 예로 들면, Entry 대상은 블로그 대상을 얻을 수 있고, 블로그 속성 e.블로그에 접근할 수 있다.django도 API를 만들어서 관계 대상의 다른 쪽에 접근합니다. 블로그 대상은Entry 목록 b.entry 에 접근합니다.set.all().
1.3.3 One-to-many 관계
개체에 ForeignKey가 있는 경우 이 모델 인스턴스는 간단한 등록 정보를 통해 관계 개체에 액세스합니다.
e = Entry.objects.get(id=2)
e.blog # Returns the related Blog object.

외키 속성으로 값을 가져오고 부여할 수 있으며, 외키 값을 수정하여save()를 실행하는 방법을 알아야 데이터베이스에 저장할 수 있습니다
e = Entry.objects.get(id=2)
e.blog = some_blog
e.save()

ForeignKey가null=True를 설정하면 None으로 값을 부여할 수 있습니다
e = Entry.objects.get(id=2)print e.blog # Hits the database to retrieve the associated Blog.print e.blog #  ;  .e = Entry.objects.select_related().get(id=2)print e.blog #  ;  .print e.blog #  ;  .b = Blog.objects.get(id=1)
b.entry_set.all() #  blog .# b.entry_set is a Manager that returns QuerySets.b.entry_set.filter(headline__contains='Lennon')
b.entry_set.count()


b = Blog.objects.get(id=1)
b.entries.all() #  blog # b.entries is a Manager that returns QuerySets.b.entries.filter(headline__contains='Lennon')
b.entries.count()

 
add(obj1, obj2, ...) 여러 개의 관계 대상create(**kwargs)를 추가하여 새 대상remove(obj1,obj2,...) 만들기여러 관계 대상 제거clear () 모든 관계 대상 제거
b = Blog.objects.get(id=1)
b.entry_set = [e1, e2]

1.3.4 Many-to-many 관계
e = Entry.objects.get(id=3)
e.authors.all() #  Entry authors .e.authors.count()
e.authors.filter(name__contains='John')

a = Author.objects.get(id=5)
a.entry_set.all() #  Author entry .

1.3.5 One-to-one 관계
class EntryDetail(models.Model):
    entry = models.OneToOneField(Entry)
    details = models.TextField()

ed = EntryDetail.objects.get(id=2)
ed.entry #   Entry  .

좋은 웹페이지 즐겨찾기