Django 와 데이터베이스 상호작용 의 실현
18879 단어 Django데이터베이스 상호작용
우선,가상 컴퓨터 데이터베이스 에 프로젝트 와 같은 이름 의 데이터 베 이 스 를 구축 하여 관리 하기에 편리 하 다.
(django_test) bd@DF:~$ mysql -u admin -p
비밀 번 호 를 입력 하고 데이터베이스 에 들 어간 후.
mysql> SHOW DATABASES;
현재 있 는 모든 데이터 베 이 스 를 보고 데이터 베 이 스 를 만 듭 니 다.
mysql> CREATE DATABASE 'django_test';
'django'라 는 이름 이 있 을 거 예요.test 데이터베이스.
+--------------------+
| Database |
+--------------------+
| information_schema |
| django_test |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.10 sec)
2 데이터베이스 와 django 의 상호작용 진행데이터베이스 가 생 긴 후에 우 리 는 이 라 이브 러 리 를 프로젝트 에 설정 하여 관계 바 인 딩 을 해 야 합 니 다.
먼저 settings.py 파일 에 있 는 DATABASES 항목:
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql', #
'NAME': 'django_test', #
'USER': 'admin', #
'PASSWORD': 'yourpassword', #
'HOST': '127.0.0.1', # IP
'PORT': '3306' # ( ubuntu , 3306, 3306)
}
}
기본 설정 설명 을 지우 고 데이터베이스 정 보 를 가 져 옵 니 다.포트 리 트 윗(ubuntu):![在这里插入图片描述](https://s1.md5.ltd/image/10016b78702728583f4f38c2c974f93f.png)
mysql 데이터 베 이 스 를 조작 해 야 하기 때문에 가상 환경 에 pymysql 을 설치 해 야 합 니 다.주의:반드시 대응 하 는 가상 환경 에 설치 해 야 합 니 다.
pip install mysql -i https://pypi.douban.com/simple
콩짜개 소스 를 사용 하 는 것 이 빠 를 것 이다.그리고 pip list 는 자신 이 pymysql 이 있 는 지 확인 합 니 다.있 으 면 프로젝트 전체 디 렉 터 리 에 들 어 가 는init__.py 파일.
import pymysql
pymysql.install_as_MySQLdb()
두 줄 코드 를 추가 하여 맵 가 져 오기 가 완료 되 었 습 니 다.그리고 데이터베이스 상호작용 을 해 야 하 는 app 의 models.py 로 갑 니 다.
from django.db import models
# Create your models here.
class User(models.Model):
# id = models.AutoField(primary_key=True) #
name = models.CharField(max_length=30)
age = models.IntegerField(null=True)
sex = models.IntegerField(null=True)
city = models.CharField(max_length=30, null=True)
note = models.TextField(null=True)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
여기 서 우 리 는 여러 항목 을 정의 한 다음 에 대응 하 는 데이터 형식 은 주의해 야 한다(당신 이 정의 한 항목 의 데이터 형식 에 따라).괄호 안의 한정 정보 도 주의해 야 한다.데이터 형식:유형
설명 하 다.
AutoField
자동 으로 증가 하 는 IntegerField 는 일반적으로 지정 하지 않 고 지정 하지 않 을 때 Django 는 자동 으로 속성 이름 이 id 인 자동 성장 속성 을 생 성 합 니 다.
BooleanField
불 필드,값 은 True 또는 False 입 니 다.
NullBooleanField
Null,True,False 세 가지 값 지원
CharField
문자열,매개 변수 maxlength 최대 문자 개수 표시
TextField
큰 텍스트 필드,보통 4000 글자 이상 사용
IntegerField
정수
DecimalField
10 진 부동 소수점,매개 변수 maxdigits 는 총 자릿수,매개 변수 decimalplaces 는 소수 자릿수 를 나타 낸다
FloatField
부동 소수점
DateField
날짜,인자 autonow 는 대상 을 저장 할 때마다 이 필드 를 현재 시간 으로 자동 으로 설정 합 니 다.'마지막 수정'에 사용 할 시간 스탬프 는 항상 현재 날 짜 를 사용 합 니 다.기본 값 은 False 입 니 다.파라미터 autonow_add 는 대상 이 처음 생 성 되 었 을 때 현재 시간 을 자동 으로 설정 합 니 다.생 성 할 시간 스탬프 는 항상 현재 날 짜 를 사용 합 니 다.기본 값 은 False 입 니 다.파라미터 autonow_add 와 autonow 는 서로 배척 하고 조합 에 오류 가 발생 합 니 다.
TimeField
시간,매개 변 수 는 DateField 와 같 습 니 다.
DateTimeField
날짜 시간,매개 변 수 는 DateField 와 같 습 니 다.
FileField
파일 필드 업로드
ImageField
FileField 에 계승 하여 올 린 내용 을 검증 하여 올 바른 그림 인지 확인 합 니 다.
한정 조건:
옵션
설명 하 다.
null
True 일 경우,비어 있 음 을 표시 합 니 다.기본 값 은 False 입 니 다.
blank
True 라면 이 필드 는 공백 으로 허용 되 며 기본 값 은 False 입 니 다.
db_column
필드 의 이름 이 지정 되 지 않 으 면 속성 이름 을 사용 합 니 다.
db_index
값 이 True 이면 표 에서 이 필드 에 색인 을 만 듭 니 다.기본 값 은 False 입 니 다.
default
기본 값
primary_key
True 이면 이 필드 는 모델 의 주 키 필드 가 되 며,기본 값 은 False 이 며,일반적으로 AutoField 옵션 으로 사 용 됩 니 다.
unique
True 라면 이 필드 는 표 에 유일한 값 이 있어 야 합 니 다.기본 값 은 False 입 니 다.
max_length
필드 길이 제한
DateField.auto_now
데 이 터 를 수정 할 때 업데이트 시간,save 방법 을 사용 해 야 유용 합 니 다.
DateField.auto_now_add
첫 번 째 추 가 는 현재 시간 을 설정 합 니 다.수정 하지 않 습 니 다.
데이터 가 져 오기 가 끝 난 후에 우 리 는 가상 컴퓨터 에서 이동 해 야 한다.항목 디 렉 터 리 로 이동 합 니 다.
python manage.py makemigrations
명령 뒤에 app 이름과 함께 특정한 app 의 모델 을 맵 으로 지정 할 수 있 습 니 다.쓰 지 않 으 면 모든 app 이 맵 파일 을 만 듭 니 다.다시 시작 하기 전에 앱 이 settings 에 등록 되 어 있다 는 것 을 보증 해 야 합 니 다.이전 이 끝 난 후에 우 리 는 이전 한 데 이 터 를 데이터베이스 에 제출 해 야 합 니 다(가상 컴퓨터 에 있 고 디 렉 터 리 에 있 습 니 다).
python manage.py migrate
이전 은 user 클래스 에서 정의 하 는 데이터 항목 을 create table 과 같은 my sql 구문 으로 바 꾼 다음 에 문 구 를 데이터베이스 에 제출 하여 표를 만 드 는 것 임 을 이해 할 수 있 습 니 다.생 성 이 완료 되면 데이터베이스 에서 작업 이 완료 되 었 는 지 확인 합 니 다.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| django_test |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use django_test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-----------------------+
| Tables_in_django_test |
+-----------------------+
| django_migrations |
| six_user |
+-----------------------+
2 rows in set (0.00 sec)
mysql> describe six_user;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | int(11) | YES | | NULL | |
| note | longtext | YES | | NULL | |
| create_time | datetime(6) | NO | | NULL | |
| update_time | datetime(6) | NO | | NULL | |
| city | varchar(30) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
여기 서 우 리 는 먼저 databases 를 보 여 줍 니 다.라 이브 러 리 를 보고 프로젝트 데이터 베 이 스 를 입력 하고 six 를 선택 하 십시오.user 표 보기.데이터 시트 생 성 작업 이 완료 되 었 습 니 다.만약 우리 가 표를 수정 해 야 한다 면,우 리 는 모델 류 만 수정 하면 된다.만약 우리 가 모델 류 에 필드 를 추가 해 야 한다 면,우 리 는 직접적 으로 증가 할 수 없다.왜냐하면 빈 필드 를 추가 하면 논리 적 오류 가 존재 하기 때문이다.즉,빈 필드 를 추가 하 는 것 은 허용 되 지 않 기 때문에 괄호 에 null=True 를 추가 해 야 합 니 다.
위 모델 류 의 city 필드 와 같이 추가 가 완 료 된 후에 이전 과 제출 을 하면 됩 니 다.바로 위의 두 단계 입 니 다.삭제 도 마찬가지 입 니 다.즉,모델 류 를 업데이트 하 는 것 이 라면 모두 위의 두 단계 가 필요 합 니 다.
3 데이터 추가
만약 우리 가 데 이 터 를 추가 해 야 한다 면,우리 가 한번 해 보 자.
from django.http import HttpResponse, HttpResponseNotFound
from django.shortcuts import redirect, render
from .models import User
# Create your views here.
def add_user(request):
#
# user = User(name='zjj', age=18)
# user.save() # save
# return HttpResponse(' ')
#
# user = User()
# user.name = 'zj'
# user.age = 18
# user.save()
# return HttpResponse(' ')
#
# User.objects.create(name='z', age=8)
# return HttpResponse(' ')
# get_or_create ( ), , , , , 。
user, flag = User.objects.get_or_create(name='z1', age=10)
message = ' '
if not flag:
message = ' '
print(user.name, user.create_time)
return HttpResponse(message)
여기 서 우 리 는 먼저 models 류 에서 우리 가 정의 하 는 User 류 를 도입 한 다음 에 User 류 의 실례 화 를 통 해 추가 해 야 한다.상기 네 가지 방법 을 예 로 들 었 다.앞의 두 가지 방법 은 모두 save 방법 을 사용 해 야 한다.뒤의 두 가 지 는 대상 을 호출 하 는 방법 으로 데 이 터 를 직접 추가 하 는 것 이 비교적 편리 하 다.여기 서 마지막 방법 을 말 해 야 한다.이 방법 은 데 이 터 를 전달 하 는 것 을 판단 할 것 이다.데이터 가 들 어 오지 않 으 면 먼저 만 들 고 이 데 이 터 를 가 져 와 True 로 돌아 갑 니 다.여기 서 제 가 위 에서 몇 개의 데 이 터 를 인쇄 했 으 니 테스트 해 보 세 요.중복 데이터 라면 만 들 지 않 고 데 이 터 를 되 돌려 주 며 False 를 추가 합 니 다.그러면 우 리 는 여기 서 가방 을 뜯 고 두 개의 인 자 를 얻 은 다음 에 판단 을 하면 페이지 의 정 보 를 전달 할 수 있다.
mysql> SELECT * FROM `six_user`;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age | sex | note | create_time | update_time | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
| 1 | zjj | 18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
| 2 | zj | 18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
| 3 | z | 8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
| 4 | z1 | 10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
4 rows in set (0.00 sec)
그 다음 에 또 하나의 방법 은 전단 페이지 에 데 이 터 를 추가 한 다음 에 백 엔 드 에서 받 은 후에 데이터 베 이 스 를 추가 하 는 것 이다.첫 번 째 단 계 는 경로 에 수신 정 보 를 추가 합 니 다.
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path(r'add_user/<name>/<age>', views.add_user)
]
보기 함수 중:
def add_user(request, name, age):
user, flag = User.objects.get_or_create(name=name, age=age)
message = ' '
if not flag:
message = ' '
print(user.name, user.create_time)
return HttpResponse(message)
이렇게 하면 우 리 는 전단 에서 데 이 터 를 받 은 후에 직접 데이터 베 이 스 를 추가 할 수 있다.![在这里插入图片描述](https://s1.md5.ltd/image/ee61126ab27e30f492041692d64caf1f.png)
mysql> SELECT * FROM `six_user`;
+----+------+------+------+------+----------------------------+----------------------------+------+
| id | name | age | sex | note | create_time | update_time | city |
+----+------+------+------+------+----------------------------+----------------------------+------+
| 1 | zjj | 18 | NULL | NULL | 2021-03-10 21:40:18.246543 | 2021-03-10 21:40:18.246564 | NULL |
| 2 | zj | 18 | NULL | NULL | 2021-03-10 21:44:36.590347 | 2021-03-10 21:44:36.590365 | NULL |
| 3 | z | 8 | NULL | NULL | 2021-03-10 21:46:37.315176 | 2021-03-10 21:46:37.315195 | NULL |
| 4 | z1 | 10 | NULL | NULL | 2021-03-10 21:56:20.559386 | 2021-03-10 21:56:20.559421 | NULL |
| 5 | zjjj | 21 | NULL | NULL | 2021-03-10 22:06:47.200072 | 2021-03-10 22:06:47.200101 | NULL |
+----+------+------+------+------+----------------------------+----------------------------+------+
5 rows in set (0.00 sec)
4 찾기 데이터4.1 모든 데이터 찾기
데이터 방법 을 찾 으 려 면 먼저 함 수 를 정 해서 해 봅 시다.
def find_user(request):
#
user_list = User.objects.all()
print(user_list)
return HttpResponse(' ')
루트 를 추가 한 후에 우 리 는 모델 클래스 에서 마법 방법 으로 print 방법 을 수정 하 는 것 을 기억 하 세 요.
def __str__(self):
return 'id=%s, name=%s, age=%s, city=%s, note=%s' % (self.id, self.name, self.age, self.city, self.note)
그럼 우 리 는 print 데 이 터 를 볼 때 좀 똑똑히 볼 수 있 습 니 다.![在这里插入图片描述](https://s1.md5.ltd/image/23a939b0def6e7284ddc375c136d778d.png)
위 는 모든 데 이 터 를 조회 하 는 것 이다.그러면 어떻게 데 이 터 를 조회 합 니까?
4.2 데이터 조회
def find_user(request):
#
user = User.objects.get(id=1)
print(user, type(user))
return HttpResponse(' ')
![在这里插入图片描述](https://s1.md5.ltd/image/3825feee5997a7c2d50fee0367d6306f.png)
여기 서 주의해 야 할 것 은 get 방법 은 유일한 데 이 터 를 조회 하 는 것 입 니 다.만약 당신 이 입력 한 조건 이 유일한 것 이 아니라면 바로 오 류 를 보고 할 수 있 습 니 다.그럼 여러 개의 데 이 터 를 조회 합 니까?
4.3 여러 가지 데이터 조회
def find_user(request):
#
user_list = User.objects.filter(name=18)
print(user_list, type(user_list))
return HttpResponse(' ')
여 기 는 filter 방법 을 사용 합 니 다.![在这里插入图片描述](https://s1.md5.ltd/image/6ca13b8a968480b7d94103ebe94adccd.png)
여기 서 돌아 오 는 것 은 집합 대상(교체 가능 대상,for 순환 가능)입 니 다.
def find_user(request):
#
user_list = User.objects.filter(age=18)
for user in user_list:
print(user)
# print(user_list, type(user_list))
return HttpResponse(' ')
이렇게 하면 여러 가지 메 시 지 를 되 돌려 줄 수 있다.![在这里插入图片描述](https://s1.md5.ltd/image/75f9606c059ab3c8a9d61f50ae38534a.png)
뿐만 아니 라 이 대상 은 슬라이스 도 할 수 있다.
def find_user(request):
#
user_list = User.objects.filter(age=18)
# for user in user_list:
# print(user)
# print(user_list, type(user_list))
print(user_list[0:1])
return HttpResponse(' ')
변신 도 할 수 있어 요.
def find_user(request):
#
user_list = User.objects.filter(age=18)
# for user in user_list:
# print(user)
# print(user_list, type(user_list))
# print(user_list[0:1])
print(list(user_list))
return HttpResponse(' ')
4 업데이트 데이터데 이 터 를 업데이트 하 는 절 차 는 수정 할 데 이 터 를 먼저 얻 은 다음 에 다시 할당 하 는 것 이다.
4.1 데이터 획득
from django.shortcuts import render
from django.http import HttpResponse
from six.models import User
from django.db.models import Count, Avg, Min, Max, Sum, F, Q
# Create your views here.
#
def find(request):
#
rs = User.objects.all()
#
rs = User.objects.first()
#
rs = User.objects.last()
#
rs = User.objects.filter(age=18)
# , get ( id ), , try
rs = User.objects.get(id=3)
이곳 의 방법 은 매우 많 으 니 필요 에 따라 올 수 있다4.2 데이터 정렬
#
rs = User.objects.order_by('age') # ,
rs = User.objects.order_by('-age') # ,
#
rs = User.objects.order_by('age', '-id')
# , count
rs = User.objects.filter(age=28).count()
# QuerySet Model , ,
rs = User.objects.all().values()
for i in rs:
print(i['name'])
print(rs)
4.3 조회 조건
#
# WHERE ,
# : __ ,
#
rs = User.objects.filter(age=18)
#
rs = User.objects.filter(name__contains='j')
#
rs = User.objects.filter(age__gt=18)
#
rs = User.objects.filter(age__gte=18)
#
rs = User.objects.filter(age__lt=18)
#
rs = User.objects.filter(age__lte=18)
#
rs = User.objects.filter(city__isnull=True)
#
rs = User.objects.filter(name__startwith='z')
#
rs = User.objects.filter(name__endwith='1')
# ,
rs = User.objects.filter(name__in=['zj', 'zjj', 'zjjjj'])
#
rs = User.objects.filter(age__range=(18, 28))
4.4 취 합 조회Count,Avg,Min,Max,Sum 은 주로 이런 방법 이 있 습 니 다.
from django.db.models import Count, Avg, Min, Max, Sum, F, Q
# , Count,Avg, Max, Min, Sum.
# aggregate() QuerySet ,
#
rs = User.objects.all().aggregate(Count('age'))
#
rs = User.objects.all().aggregate(Avg('age'))
#
rs = User.objects.all().aggregate(Max('age'))
#
rs = User.objects.all().aggregate(Min('age'))
#
rs = User.objects.all().aggregate(Sum('age'))
# key , key
rs = User.objects.all().aggregate(ageSum=Sum('age'))
4.5 그룹 검색
#
# QuerySet
# values , ,
rs = User.objects.values('age')
# age , , age
rs = rs.annotate(count=Count('age'))
#
rs = User.objects.values('age').annotate(count=Count('age'))
F 와 Q 조회
from django.db.models import F, Q
# F
# User (+1), -1
rs = User.objects.all().update(age=F('age') + 1)
# Q
# , Q
# & (and) | (or) ~ (not)
# zj 18
rs = User.objects.filter(Q(name='zj') | Q(age=18))
# zjjj, 28
rs = User.objects.filter(Q(name='zjjj') & ~Q(age=28))
print(rs)
return HttpResponse(' ')
Q 조 회 는 일반적으로 논리 적 조회 에 사용 된다.여기 서 Django 와 데이터베이스 의 상호작용 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Django 데이터베이스 의 상호작용 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.