django 의 크로스 테이블 조회 및 기록 추가 예시 코드

생 성 표
책 모형:책 은 제목 과 출판 날짜 가 있 고 한 권 의 책 은 여러 명의 작가 가 있 을 수 있 으 며 한 작가 도 여러 권 의 책 을 쓸 수 있 기 때문에 작가 와 책의 관 계 는 여러 쌍 의 관련 관계(many-to-many)이다.
한 권 의 책 은 한 출판사 에서 만 출판 되 어야 하기 때문에 출판사 와 책 은 한 쌍 의 다 중 관계(one-to-many)이다.
일대일 관계 만 들 기:OneToOne("관 계 를 연결 할 표 이름")
한 쌍 이상 의 관 계 를 만 듭 니 다:ForeignKey("관 계 를 연결 할 표 이름")
다 중 관계 만 들 기:Many ToMany("관 계 를 연결 할 표 이름")  세 번 째 시 계 를 자동 으로 만 듭 니 다.

class Book(models.Model):
  nid = models.AutoField(primary_key=True) #   id(    ,      id)
  title = models.CharField(max_length=32)
  publishDdata = models.DateField() #     
  price = models.DecimalField(max_digits=5, decimal_places=2) #   5 ,      

  #         ,           
  #      publish_id,  django         _id
  publish = models.ForeignKey("Publish") #foreignkey(  )        
  # publish             
  authorlist = models.ManyToManyField("Author") #         
  def __str__(self): #__str__               ,          
    return self.title
class Publish(models.Model):
  #  id               id
  name =models.CharField(max_length=32)
  addr = models.CharField(max_length=32)

  def __str__(self):
    return self.name
class Author(models.Model):
  name = models.CharField(max_length=32)
  age = models.IntegerField()

class AuthorDeital(models.Model):
  tel = models.IntegerField()
  addr = models.CharField(max_length=32)
  author = models.OneToOneField("Author") #         

메모:임시로 추 가 된 필드 입 니 다.우선 이전의 데이터 가 있 는 지 없 는 지 를 고려 해 야 합 니 다.기본 값 을 설정 합 니 다.

wordNum = models.IntegerField(default=0)  
로 깅 을 통 해 번역 한 sql 문 구 를 볼 수 있 습 니 다.

LOGGING = {
  'version': 1,
  'disable_existing_loggers': False,
  'handlers': {
    'console':{
      'level':'DEBUG',
      'class':'logging.StreamHandler',
    },
  },
  'loggers': {
    'django.db.backends': {
      'handlers': ['console'],
      'propagate': True,
      'level':'DEBUG',
    },
  }
}  
주의사항:
1.표 의 이름 my app모델 Name 은 모델 의 메타 데이터 에 따라 자동 으로 생 성 되 며 다른 이름 으로 덮어 쓸 수도 있 습 니 다.
2.id 필드 는 자동 으로 추 가 됩 니 다.
3、외부 키 필드 에 Django 는 필드 이름 에"id"데이터베이스 에 있 는 열 이름 만 들 기
4.이 예 에서 CREATE TABLE SQL 문 구 는 PostgreSQL 문법 형식 을 사용 합 니 다.Django 는 settings 에서 지정 한 데이터베이스 형식 에 따라 해당 하 는 SQL 문 구 를 사용 합 니 다.
5.모델 을 정의 한 후 Django사용이 모형 들.당신 이 해 야 할 일 은 프로필 에 있 는 INSTALL 을 수정 하 는 것 입 니 다.APPSZ 에는 models.py 가 있 는 애플 리 케 이 션 의 이름 을 추가 하도록 설정 되 어 있 습 니 다.
6.외부 키 필드 ForeignKey 는 null=True 의 설정 이 있 습 니 다.(외부 키 가 빈 값 NULL 을 받 아들 일 수 있 도록 합 니 다)빈 값 None 를 부여 할 수 있 습 니 다.
필드 옵션
필드 마다 특별한 인자 가 있 습 니 다.예 를 들 어 CharField 는 max 가 필요 합 니 다.length 매개 변 수 는 VARCHAR 데이터베이스 필드 의 크기 를 지정 합 니 다.모든 필드 에 적용 되 는 일반적인 매개 변수 도 있다.이 매개 변 수 는 문서 에서 상세 하 게 정의 되 어 있 습 니 다.여기 서 우 리 는 가장 자주 사용 하 는 것 만 간단하게 소개 합 니 다.
1)null
True 라면 Django 는 데이터베이스 에 빈 값 을 NULL 로 저장 합 니 다.기본 값 은 False 입 니 다.
(1)blank
True 라면,이 필드 는 채 우지 않 을 수 있 습 니 다.기본 값 은 False 입 니 다.
이것 은 null 과 다 릅 니 다.null 은 순 전 히 데이터베이스 범주 이 고 Blank 는 데이터 검증 범주 입 니 다.
한 필드 의 blank=True 가 있 으 면 폼 의 검증 은 이 필드 가 비어 있 는 것 을 허용 합 니 다.필드 의 blank=False 라면 이 필드 는 필수 입 니 다.
(2)default
필드 의 기본 값 입 니 다.값 이나 호출 가능 한 대상 일 수 있 습 니 다.호출 이 가능 하 다 면 새 대상 이 생 성 될 때마다 호출 됩 니 다.
(3)primary_key
True 라면 이 필드 가 모델 의 메 인 키 입 니 다.필드 의 primary 를 지정 하지 않 았 다 면key=True,
Django 는 자동 으로 Integer Field 필드 를 주 키 로 추가 합 니 다.따라서 기본 키 행동 을 덮어 쓰 지 않 으 려 면,
그렇지 않 으 면 필드 의 primary 를 설정 할 필요 가 없습니다.key=True。
(4)unique
이 값 이 True 로 설정 되면 이 데이터 필드 의 값 은 전체 표 에서 유일 해 야 합 니 다.
(5)choices
이원 그룹 으로 구 성 된 교체 가능 한 대상(예 를 들 어 목록 이나 원 그룹)은 필드 에 선택 항목 을 제공 합 니 다.choices 를 설정 하면,
기본 폼 은 표준 텍스트 상자 가 아 닌 선택 상자 이 며,이 선택 상자 의 옵션 은 choices 의 옵션 입 니 다.
이것 은 choices 목록 에 대한 예 입 니 다.

YEAR_IN_SCHOOL_CHOICES = (
  ('FR', 'Freshman'),
  ('SO', 'Sophomore'),
  ('JR', 'Junior'),
  ('SR', 'Senior'),
  ('GR', 'Graduate'),
)
각 모듈 의 첫 번 째 요 소 는 데이터베이스 에 저 장 된 값 입 니 다.두 번 째 요 소 는 관리 인터페이스 나 Model ChoiceField 에서 표시 하 는 내용 입 니 다.
주어진 model 클래스 의 인 스 턴 스 에서 choices 필드 의 표시 값 을 얻 으 려 면 get 을 호출 합 니 다.FOO_display 방법(여기 FOO 는 choices 필드 의 이름 입 니 다).예 를 들 면:

from django.db import models

class Person(models.Model):
  SHIRT_SIZES = (
    ('S', 'Small'),
    ('M', 'Medium'),
    ('L', 'Large'),
  )
  name = models.CharField(max_length=60)
  shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)


>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large

데이터 모델 을 만 든 후에 django 는 데이터베이스 추상 적 인 API 를 자동 으로 생 성하 여 표 기록 에 대한 추가 삭제 와 검 사 를 수행 할 수 있 습 니 다.
기록 추가
한 쌍 의 다 중 기록 추가:

 #       
  #    :         publish_id      ,              
  #   :      (  book      publish    )   publish 
  #   :    
  models.Book.objects.create(title="     ",publishDdata="2015-5-8",price="111",publish_id=1)
  #    :  
  pub_obj = models.Publish.objects.filter(name="     ")[0]
  print(pub_obj)
  models.Book.objects.create(title = "  ",publishDdata="2000-6-6",price="222",publish=pub_obj)

  #    :save
  pubObj= models.Publish.objects.get(name="     ") #        get,           
  bookObj = models.Book(title = "     ",publishDdata="2015-9-9",price="50",publish=pubObj)
  bookObj.save()

다 중 추가 기록:
책 과 작 가 는 다 대 다 의 관계 이다.한 책 에 여러 작가 가 있 을 수 있 고 한 작가 가 여러 권 의 책 을 출판 할 수 있다.
STEP:책 대상 찾기
필요 한 작성 자 대상 을 찾 습 니 다.
책 대상 에 게 작가 대상 을 연결 하 는 것(add 방법 으로),즉 여러 쌍 의 관 계 를 연결 하 는 것 입 니 다.

#            
  #    :
  #       :
  pub_obj=models.Publish.objects.filter(name="     ").first()
  book_obj = models.Book.objects.create(title="   ",publishDdata="2015-4-10",price="222",publish=pub_obj)
  # #       django    id
  haiyan_obj = models.Author.objects.filter(name="haiyan")[0]
  egon_obj = models.Author.objects.filter(name="egon")[0]
  xiaoxiao_obj = models.Author.objects.filter(name="xiaoxiao")[0]
  #         、
  book_obj.authorlist.add(haiyan_obj, egon_obj, xiaoxiao_obj)

  #    =========,       
  pub_obj = models.Publish.objects.filter(name="     ").first()
  book_obj = models.Book.objects.create(title="   ", publishDdata="2015-4-10", price="222", publish=pub_obj)
  authers = models.Author.objects.all()
  # #       
  book_obj.authorlist.add(*authers)

귀속 해제:remove
\#특정 대상 을 관련 대상 집합 에서 제거 합 니 다.    ======   book_obj.authors.remove(*[])

#         (remove) book_obj=models.Book.objects.filter(title="   ").last() #      authers=models.Author.objects.filter(id__lt=3) #            book_obj.authorlist.remove(*authers) #        ,   *
바 인 딩 제거:clear"  #관련 대상 집합 비우 기.

  #       (clear)
  book_obj= models.Book.objects.filter(title="   ")
  for book_obj_item in book_obj:#            
    book_obj_item.authorlist.clear()
결론:remove 와 clear 의 차이
remove:그래,네가 지 울 데 이 터 를 선별 해서 제거 해.
clear:찾 지 마 세 요.바로 데 이 터 를 비 웠 어 요.
각각 응용 장면 이 있다.
3.대상 기반 조회 기록(sql 구문 에 해당 하 는 where 서브 조회)
일대일 조회 기록:author 와 authordetile 은 일대일 관계 입 니 다.
정방 향 조회(필드 별 author)
역방향 조회(표 명 authordeital):일대일 관계 이기 때문에 사용 하지 않 습 니 다set 했 어.

 #       
  #     :    13245      
  deital_obj = models.AuthorDeital.objects.filter(tel="13245").first()
  print(deital_obj.author.name)
  #     :  egon    
  egon_obj = models.Author.objects.filter(name="egon").first()
  print(egon_obj.authordeital.tel)
한 쌍 의 다 중 조회 기록
정방 향 조회(필드:publish):
역방향 조회(표 이름:bookset):

 #     :                 
  book_obj = models.Book.objects.filter(title="     ")[0] #    
  print("======", book_obj.publish) #             
  print(book_obj.publish.addr)
 #     :                     
  pub_obj = models.Publish.objects.filter(name="     ")[0]
  book_dic = pub_obj.book_set.all().values("price", "title")[0]
  print(book_dic)
  print(book_dic["price"])
  #                 

  publish=models.Publish.objects.get(name="     ")  #get          ,  get          

  book_list=publish.book_set.all() #                  

   for book_obj in book_list:

   print(book_obj.title)

여기 서 for 순환 을 사용 하거나 values 를 사용 하면 vauleslist 가 모두 가능 합 니 다.
다 중 조회 기록
정방 향 조회(필드 별 authorlist)
역방향 조회(표 이름 에 따라 bookset)

 #       
  #     :                       
  book_obj = models.Book.objects.filter(title="   ")[0]
  print(book_obj.authorlist.all().values("name", "age")) #                
  #     :     haiyan             
  haiyan_obj = models.Author.objects.filter(name="haiyan")[0]
  print("bookinfo====", haiyan_obj.book_set.all().first().title) #                
  return HttpResponse("ok")
ForeignKey()와 ManyToMany Field 의 정의 에서 related 를 설정 할 수 있 습 니 다.name 의 값 은 FOO 를 덮어 씁 니 다.set 의 이름.예 를 들 어 Article model 에서 변경 을 하면 publish=ForeignKey(Blog,relatedname='bookList'),그러면 다음 에 우리 가 본 것 처럼:

#                 
  publish=Publish.objects.get(name="     ") 
  book_list=publish.bookList.all() #                  
이중 밑줄 기반 크로스 테이블 조회
Django 는 검색(lookups)에서 관련 관 계 를 표시 하 는 직관 적 이 고 효율 적 인 방식 도 제공 하여 SQL JOIN 의 관 계 를 자동 으로 확인 할 수 있 습 니 다.크로스 관계 조 회 를 하려 면 모델(model)간 관련 필드 의 이름 을 마지막 으로 원 하 는 model 에 연결 할 때 까지 밑줄 두 개 를 사용 하 십시오.(sql 문 구 를 join 으로 연결 하 는 방식 과 같 습 니 다.settings 에서 설정 할 수 있 고 sql 문 구 를 볼 수 있 습 니 다)
한 쌍 의 다 중 조회:
연습 1.인민 출판사 에서 출판 한 모든 책의 가격 과 이름 조회

#            1================   
  #      
  ret = models.Publish.objects.filter(name="     ").values("book__price","book__title")
  print(ret)
  #      
  ret2 = models.Book.objects.filter(publish__name="     ").values("price","title")
  print(ret2)
연습 2.Liux 라 는 책의 출판사 주 소 를 조회 합 니 다:filer 먼저 걸 러 내 고 values 는 요구 하 는 필드 를 표시 합 니 다.

       
  ret = models.Book.objects.filter(title="linux").values("publish__addr")
  print(ret)
       
  ret2 = models.Publish.objects.filter(book__title="linux").values("addr")
  print(ret2)
다 중 검색
연습 1.egon 에서 나 온 모든 책의 이름 조회

#     
  ret = models.Author.objects.filter(name="egon").values("book__title")
  print(ret)
#   :            
  ret2 = models.Book.objects.filter(authorlist__name="egon").values("title")
  print(ret2)
연습 2.핸드폰 번호 조회 151 로 시작 하 는 작가 가 출판 한 모든 책의 이름과 출판사 의 이름

  #    :
  author_obj = models.AuthorDeital.objects.filter(tel__startswith="151").first()
  print(author_obj.author.book_set.all().values("title","publish__name"))
  #    :
  ret = models.Book.objects.filter(authorlist__author_deital__tel__startswith="151").values("title","publish__name")
  print(ret)
집합 조회 와 그룹 조회(중요 합 니 다!!)
취 합 조회:aggregate(*args,**kwargs),한 그룹 만 취 합

from django.db.models import Avg,Sum,Count,Max,Min
# 1、            print(models.Book.objects.all().aggregate(Avg("price")))
aggregate()는 Query Set 의 종료 자구(즉,더 이상 Query Set 집합 이 아 닐 때)입 니 다.키 값 이 맞 는 사전 을 되 돌려 준 다 는 뜻 입 니 다.키 의 이름 은 집합 값 의 식별 자 이 고 값 은 계 산 된 집합 값 입 니 다.키 의 이름 은 필드 와 집합 함수 의 이름 에 따라 자동 으로 생 성 됩 니 다.집합 값 의 이름 을 지정 하려 면 집합 자구 에 제공 할 수 있 습 니 다.

from django.db.models import Avg,Sum,Count,Max,Min
# 1、           
print(models.Book.objects.all().aggregate(avgprice = Avg("price")))
하나의 집합 만 생 성 하 기 를 원한 다 면 aggregate()자구 에 다른 인 자 를 추가 할 수 있 습 니 다.따라서 모든 도서 가격 의 최대 치 와 최소 치 를 알 고 싶다 면 이렇게 조회 할 수 있다.

print(models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price")))
#      : {'price__avg': 174.33333333333334, 'price__max': Decimal('366.00'), 'price__min': Decimal('12.00')}

그룹 조회:annotate():Query Set 의 모든 대상 에 게 독립 된 집계 값 을 생 성 합 니 다.팀 을 나 눈 결과 에 대한 취 합 입 니 다.
1.각 책의 저자 개 수 를 집계 한다.

  #    :
  print(models.Book.objects.all().annotate(authorNum = Count("authorlist__name")).values("authorNum"))
  #    :
  booklist =models.Book.objects.all().annotate(authorNum=Count("authorlist__name"))
  for book_obj in booklist:
    print(book_obj.title,book_obj.authorNum)
2.출판사 마다 가장 싼 책 을 집계 한다.

  # 2、              
  #    :
  print(models.Book.objects.values("publish__name").annotate(nMinPrice=Min('price')))   :values     group by   ,,       
  #    :
  print(models.Publish.objects.all().annotate(minprice=Min("book__price")).values("name","minprice"))
  #    
  publishlist = models.Publish.objects.annotate(minprice = Min("book__price"))
  for publish_obj in publishlist:
    print(publish_obj.name,publish_obj.minprice)
3.py 로 시작 하 는 모든 책의 작가 개 수 를 통계 한다.

print(models.Book.objects.filter(title__startswith="py").annotate(authNum = Count("authorlist__name")).values("authNum"))

4 통 계 는 한 작가 의 도서 가 아니다.

print(models.Book.objects.annotate(num_authors=Count('authorlist__name')).filter(num_authors__gt=1).values("title","num_authors"))
5.한 권 의 도서 작가 수량 에 따라 조회 집 Query Set 을 정렬 합 니 다.

print(models.Book.objects.all().annotate(authorsNum=Count("authorlist__name")).order_by("authorsNum"))
6.각 작가 가 낸 책의 총 가격 조회:

 #    
  print(models.Author.objects.all().annotate(priceSum = Sum("book__price")).values("name","priceSum"))
 #    
  print(models.Book.objects.values("authorlist__name").annotate(priceSum=Sum("price")).values("authorlist__name","priceSum"))

F 조회 와 Q 조회
F 조회:
위의 모든 예 에서 우리 가 만 든 필 터 는 필드 값 을 상수 와 비교 할 뿐이다.만약 우리 가 두 필드 의 값 을 비교 하려 고 한다 면 어떻게 해 야 합 니까?
Django 는 F()를 제공 하여 이런 비 교 를 합 니 다.F()의 인 스 턴 스 는 검색 에서 필드 를 참조 하여 같은 model 인 스 턴 스 의 두 필드 의 값 을 비교 할 수 있 습 니 다.
1.읽 기 수 보다 댓 글 수가 많은 책 보기

 from django.db.models import F,Q
 print(models.Book.objects.filter(commentNum__gt=F("readNum")))
2.수정 작업 도 F 함 수 를 사용 할 수 있 습 니 다.예 를 들 어 id 가 1 이상 인 모든 책의 가격 을 100 위안 올 릴 수 있 습 니 다.

print(models.Book.objects.filter(nid__gt=1).update(price=F("price")+100))
3.Django 는 F()대상 과 F()대상 과 상수 간 의 가감 승제 와 취 모 를 지원 합 니 다.

#           2    
  models.Book.objects.filter(commnetNum__lt=F('keepNum')*2)
Q 조회:
filter()등의 방법 에서 키워드 파라미터 조 회 는 모두 함께"AND"를 진행 합 니 다.더 복잡 한 조회(예 를 들 어 OR 구문)를 실행 하려 면 Q 대상 을 사용 할 수 있 습 니 다.
1.조회 id 가 1 이상 이 고 댓 글 수가 100 이상 인 책

 print(models.Book.objects.filter(nid__gt=1,commentNum__gt=100))
 print(models.Book.objects.filter(nid__gt=1).filter(commentNum__gt=100))
 print(models.Book.objects.filter(Q(nid__gt=1)&Q(commentNum__gt=100)))
2.조회 댓 글 수가 100 보다 많 거나 200 보다 적은 책

print(models.Book.objects.filter(Q(commentNum__gt=100)|Q(readNum__lt=200)))
Q 대상 은&와|연산 자 를 조합 할 수 있 습 니 다.두 개의 Q 대상 에 연산 자 를 사용 할 때 새로운 Q 대상 이 생 긴 다.
3.조회 연도 가 2017 년 또는 가격 이 200 이상 인 책

print(models.Book.objects.filter(Q(publishDdata__year=2017)|Q(price__gt=200)))
4.조회 연 도 는 2017 년 또는 가격 이 200 이상 인 책 이 아 닙 니 다.

print(models.Book.objects.filter(~Q(publishDdata__year=2017)&Q(price__gt=200)))
주의:
조회 함 수 는 Q 대상 과 키워드 인 자 를 혼합 하여 사용 할 수 있 습 니 다.검색 함수 에 제공 되 는 모든 인자(키워드 파라미터 나 Q 대상)는'AND'를 함께 합 니 다.단,Q 대상 이 나타 나 면 모든 키워드 인자 앞 에 있어 야 합 니 다.예 를 들 면:

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

좋은 웹페이지 즐겨찾기