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"
)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.