Django 의 모델 층 다 중 표 작업 의 실현

1.모델 만 들 기
1.한 쌍 의 다 중 관계
한 권 의 책 은 한 출판사 만 있 고 한 출판사 가 여러 권 의 책 을 출판 할 수 있 기 때문에 책 과 출판사 간 에 한 쌍 의 다 관 계 를 구성한다.책 은'다'의 한 쪽 이 고 출판 사 는'1'의 한 쪽 이다.우 리 는 모델 을 만 들 때 외 키 를'다'의 한 쪽 에 쓴다.즉,우 리 는 외 키 를 북 류 에 써 야 한다.

class Book(models.Model):
 name=models.CharField(max_length=15)
 price=models.IntegerField()
 publish=models.ForeignKey('Publish',on_delete=models.CASCADE) #     ,         ,          ,      ,      id  

class Publish(models.Model):
 name=models.CharField(max_length=15)
 addr=models.CharField(max_length=15)
 phone=models.IntegerField()

모델 을 만 들 때 id 필드 를 만 들 지 않 아 도 됩 니 다.Makemigrations 명령 을 입력 하면 migrations 폴 더 에서 py 파일 기록 models.py 의 모든 변경 사항 을 생산 합 니 다.기록 할 때 자동 으로 증가 하 는 메 인 키 필드 id 를 추가 합 니 다.
2.다 대 다 관계
한 권 의 책 은 여러 명의 작가 가 있 을 수 있 고 한 작가 가 여러 권 의 책 을 쓸 수 있 기 때문에 책 과 작 가 는 여러 쌍 의 관 계 를 구성 할 수 있다.우 리 는 모델 을 만 들 때 여러 쌍 의 관 계 를 그 중의 모든 표 에 쓸 수 있다.

class Book(models.Model):
 name=models.CharField(max_length=15)
 price=models.IntegerField()
 publish=models.CharField(max_length=15)
 author=models.ManyToManyField('Author',db_table='book_author')            ,     book    ,            Author,               ‘book_author',    ,
       _       _         。 ‘app_book_author'
 class Meta:         ‘book',    ,   APP _   , 'app_book'
  db_table='book'

class Author(models.Model):
 name=models.CharField(max_length=15)
 age=models.IntegerField()
 class Meta:
  db_table='author'
                book id author id,          id      
3.일대일 관계
한 작 가 는 한 작가 의 상세 한 정보 표 에 만 대응 할 수 있다.그들 사 이 는 일대일 관계 이다.이것 은 여러 쌍 과 똑 같 고 관 계 는 어느 표 에 써 도 된다.

class Author(models.Model):
 name=models.CharField(max_length=15)
 age=models.IntegerField()
 author_info=models.OneToOneField('Author_Info',on_delete=models.CASCADE)           ,     ,      ,      ,           
 class Meta:
  db_table='author'
  
class Author_Info(models.Model):
 gf_name=models.CharField(max_length=10)
 telephone=models.IntegerField()
 ShenFenZheng=models.IntegerField()
4.여기 서 Django 의 database:db.sqlite 3 를 사용 할 수 있 습 니 다.
절 차 는 다음 과 같다.


5,데이터베이스 이전

Django 는 기본적으로 db.sqlite 이기 때문에 settings 설정 을 하지 않 아 도 되 고 프로젝트 의 도 필요 없습니다.init__.py 에 코드 를 쓰 고 지금 은 데이터베이스 이전 명령 두 개 만 입력 하면 됩 니 다.

여 기 를 클릭 하고 입장:

여기에 명령 을 입력 하면 python manage.py 를 쓸 필요 가 없습니다.manage.py 에 들 어 갔 기 때 문 입 니 다.
현재 makemigrations 명령 을 입력 하 십시오.\#models.py 파일 의 변 화 를 기록 한 다음 migrations 폴 더 에서 py 파일 을 생산 합 니 다.
migrate 명령 을 입력 하 십시오\#migrations 파일 에서 새로 변 경 된 이전 파일 을 실행 하여 데이터 베 이 스 를 업데이트 합 니 다.
여기 서 시 계 를 만 드 는 데 성 공 했 습 니 다.
2.표 기록 추가
1.한 쌍 의 다 중 관계
이전에 우 리 는 Book 표 와 Publish 표를 만 들 었 습 니 다.둘 은 한 쌍 이 많은 관계 입 니 다.Book 표 는'많 음'의 한 쪽 이기 때문에 외부 키 필드 는 Book 표 에 있 습 니 다.Book 표 는 이전 과 다 르 게 추가 되 었 고'하나'의 Publish 표 는 하나의 표 입 니 다.예전 과 같 기 때문에 우 리 는'많 음'의 Book 표 추가 만 배우 면 됩 니 다.표 기록 을 추가 하 는 데 는 두 가지 방법 이 있다.
1.1 models.py 의 북 클래스 속성 에 따라 추가

pub=Publish.objects.all().filter(id=1).first()  #    id 1 Publish  
book=Book.objects.create(name=name,price=price,publish=pub,pub_date=pub_date) #          Book  publish  
1.2 데이터베이스 에 있 는 북 시트 의 필드 에 따라 추가

book=Book.objects.create(name=name,price=price,publish_id=1,pub_date=pub_date) 
#   Publish id   book  publish_id   
2.다 대 다 관계
이전에 우 리 는 북 시트 와 Author 표를 만 들 었 는데 둘 은 다 중 관계 입 니 다.저 는 다 중 관 계 를 북 시트 에 썼 기 때문에 북 에서 관련 관 계 를 추가 하 는 것 이 긍정 적 입 니 다.

#          
book_obj=Book.objects.create(title="     ",price=200,publishDate="2012-11-12",publish_id=1)
#           
a1=Author.objects.filter(id=2).first() #  Author     2   
a2=Author.objects.filter(id=1).first() #  Author     1   


#        ,     book_authors     ,     ,     _set

   , Book   ,          Book  ,          ,   
book_obj.author.add(author1,author2) #   book_obj     author1 author2    。   author  Author  ,  Book      
   , Author   ,           Author ,        ,     _set
author_obj.book_set.add(book1,book2) #   author_obj     book1 book2    ,    book   Author    ,         ,  Book       
      :
1,add()  
        n      ,      
      queryset  , author_list=Author.objects.filter(id__gt=2),    id  2     
book_obj.author.add(*author_list)
          ,      
book_obj.author.add(*[1,3,4])

2,remove()  ,      
  book1   author1 author2    
book1.author.remove(author1) #  book1   author2    
    author2.book_set.remove(book2) # author2     book2   

3,clear()  ,      
book1.author.clear()  # book1          ,  book1        
author1.book_set.clear()    , author1              

4,set()  ,        ,       
  book1   author1
book1.author.set(author2)    author1       ,      author2     
  author3   book1
author3.book_set.set(book2)         ,    book2     

5,=  ,         ,          
  book1  author1
new_list=[author2,author3]
book1.author=new_list             ,          book1      
3.일대일 관계
이전에 만 든 Author 표 와 AuthorInfo 표 사 이 는 일대일 관계 입 니 다.저 는 관련 필드 를 Author 표 에 썼 습 니 다.

 Author      
info=Author_Info.objects.create(gf_name=gf_name,telephone=telephone,ShenFenZheng=ShenFenZheng) #       Author_Info  ,info    Author_info  
Author.objects.create(name=name,age=age,author_info=info)      info     author_info  

      ,     Author      
Author.objects.create(name=name,age=age,author_info_id=2)
3.대상 을 바탕 으로 하 는 크로스 테이블 조회(바로 하위 조회)
1.한 쌍 의 다 중 조회(Book 과 Publish)
1.1 정방 향 조회(속성:publish)

#      1            
book_obj=Book.objects.filter(pk=1).first()
# book_obj.publish     1             
print(book_obj.publish.city)  
1.2 역방향 조회(표 이름 에 따라 소문 자set:book_set)

publish=Publish.objects.get(name="     ")
#publish.book_set.all() :                  
book_list=publish.book_set.all() 
for book_obj in book_list:
  print(book_obj.title)
2,일대일 조회(Author 와 AuthorInfo)
2.1 정방 향 조회(속성:authorinfo)

egon=Author.objects.filter(name="egon").first()
print(egon.authorDetail.telephone)
2.2 역방향 조회(표 이름 소문 자:author)

#                
 
authorDetail_list=AuthorDetail.objects.filter(addr="beijing")
for obj in authorDetail_list:
  print(obj.author.name)
3.다 중 조회(Author 와 Book)
3.1 정방 향 조회(속성:author)

#                
 
book_obj=Book.objects.filter(title="   ").first()
authors=book_obj.authors.all()
for author_obj in authors:
  print(author_obj.name,author_obj.authorDetail.telephone)
3.2 역방향 조회(표 이름 에 따라 소문 자set:book_set)

#   egon          
 
 author_obj=Author.objects.get(name="egon")
 book_list=author_obj.book_set.all()  # egon         
 for book_obj in book_list:
  print(book_obj.title)
4,related_name 설정

    Foreignkey MangToMangField      related_name     foo_set   。
publish=ForeignKey('Publish',related_name='booklist') #    ,       _set,  booklist
#                 
publish=Publish.objects.get(name="     ")
book_list=publish.bookList.all() #                  
4.더 블 밑줄 을 기반 으로 하 는 크로스 테이블 조회
Django 는 검색 에서 관련 관 계 를 나타 내 는 직관 적 이 고 효율 적 인 방식 도 제공 하여 sql join 관 계 를 자동 으로 확인 할 수 있 습 니 다.크로스 관계 조 회 를 하려 면 모델 간 관련 필드 의 이름 을 마지막 으로 원 하 는 model 에 연결 할 때 까지 밑줄 두 개 를 사용 하 십시오.
정방 향 조 회 는 속성 에 따라,역방향 조 회 는 표 이름 에 따라 소문 자로 한다.
1.한 쌍 의 다 중 조회

#   :                      (   )

 #         :publish

 queryResult=Book.objects
            .filter(publish__name="     ")
            .values_list("title","price")

 #         :book

 queryResult=Publish.objects
              .filter(name="     ")
              .values_list("book__title","book__price")
2.다 중 검색

#   :   alex          (   )

 #         :authors:
 queryResult=Book.objects
            .filter(authors__name="yuan")
            .values_list("title")

 #         :book
 queryResult=Author.objects
              .filter(name="yuan")
              .values_list("book__title","book__price")
3.일대일 관계

#   alex    
 
 #     
 ret=Author.objects.filter(name="alex").values("authordetail__telephone")

 #     
 ret=AuthorDetail.objects.filter(author__name="alex").values("telephone")
4,진급 연습

#   :                          


 #     
 queryResult=Book.objects
            .filter(publish__name="     ")
            .values_list("title","authors__name")
 #     
 queryResult=Publish.objects
              .filter(name="     ")
              .values_list("book__title","book__authors__age","book__authors__name")


#   :     151                      


 #   1:
 queryResult=Book.objects
            .filter(authors__authorDetail__telephone__regex="151")
            .values_list("title","publish__name")
 #   2: 
 ret=Author.objects
    .filter(authordetail__telephone__startswith="151")
    .values("book__title","book__publish__name")
5.취 합 조회 와 그룹 조회
모이다

aggregate(*args,**kwargs) Queryset       ,    ,               。                        
           
from django.db.models import Avg
Book.objects.all().aggregate(Avg('price'))
  :{'price__avg': 34.35}
               ,                  ,  ,             
Book.objects.aggregate(average_price=Avg('price'))
{'average_price': 34.35}
                ,            
from django.db.models import Avg, Max, Min
Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
{'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}
aggregate()         ,           n  ,  aggregate()            ,           
2,그룹
2.1 단일 테이블 그룹 조회

                 
emp:
id name age salary dep
 alex 12 2000     
 egon 22 3000     
 wen 22 5000     
emp.objects.values('dep').annotate(c=Count('*'))
values(‘dep')   ‘dep'    
annotate()          
2.2 다 중 표 그룹 조회

                  
Publish.objects.values('name').annotate(c=Count('book'))  #       ,   ‘book' ,         ,    Publish.name  
              join    ,               

      :
publishlist=Publish.objects.annotate(c=Count('book'))      Publish      ‘c'  。           , Publish  ,    Publish     
publishlist   queryset    ,     publish     ,              ‘c'  
for publish in publishlist:
  print(publish.name,publish.c)   for               ,      ‘.'           
       for  ,   values_list()     ,    for      :values_list('name','c')

           
Book.objects.annotate(c=Count('author')).values_list('name','c')

filter()  annotate()       where
      py           :
Book.objects.filter(name__startswith='py').annotate(c=Count('author')).values_list('name','c')

filter()  annotate()      having
        1   :
Book.objects.annotate(c=Count('author')).filter(c__gt=1).value_list('name','c')

           :
Book.objects.annotate(c=Count('author')).orderby('c')
6.F 조회 와 Q 조회
1,F 조회

   ,               ,  filter(id__gt=2),   ,    ,     ss       ws  ,               :
student.objects.filter(ws__gt=ss)          ,            ,       F         ,      :
student.objcts.filter(ws__gt=F('ss')) F('ss')     ss       ,          ,          

                 
student.objects.filter(ws__gt=F('ss')*2)

            10 :
student.objects.all().update(ws=F('ws')+10)
2,Q 조회

      filter() ,   ‘,'     ,      ,     Q          
Book.objects.filter(Q(id__gt=2)|Q(title__startswith='p'))    id  2   ‘p'   
Book.objects.filter(Q(id__gt=2)&Q(title__startswith='p'))    id  2  ‘p'   
Book.objects.filter(Q(id__gt=2)|~Q(title__startswith='p'))    id  2   ‘p'   

Q            , Q()   
Book.objects.filter(Q(pub_date__year=2017)|Q(pub_date__year=2016),pub_date__month=2)   2017 2   2016 2     
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기