Django 의 모델 층 다 중 표 작업 의 실현
14019 단어 Django모형 층다 중 테이블 조작
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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.