딱고의 ORM 베이스.

16052 단어 Django
bobo0609
ORM, 관계 객체 매핑(Object Relational Mapping)
두 가지 방법: 1, DB first 2, Code first(메인스트림)
기본 단계
클래스 만들기 app01/models.py
from django.db import models    
class UserInfo(models.Model):    
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

APP proj/settings를 등록합니다.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]

데이터베이스 엔진 수정 settings.py django는 기본적으로 sqlite 데이터베이스를 사용합니다. 다른 데이터베이스에 저장된 데이터를 수정하려면 데이터베이스 엔진을 수정해야 합니다. 예를 들어 MySQL:
DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}    

PS: Django는 기본적으로 MySQLdb 모듈을 사용하여 MySQL을 연결하지만python3에는 이 모듈이 없기 때문에pymysql로 대체하여 프로젝트와 같은 이름의 폴더에 있는init__파일에 다음 코드를 추가합니다: import pymysql pymysql.install_as_MySQLdb () 명령 실행python 관리자.py makemigrations # 모든 models를 찾습니다.py, 해당하는migrations에서 000x 생성initial.py 파일, 데이터베이스 변화 기록 python 관리자.py migrate # 기준 000xinitial.py 파일, 데이터베이스 테이블 생성.
#    model.py     ,        
from django.db import models    
class UserInfo(models.Model):    
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)        
    email = models.CharField(max_length=60,null=True)  #          ,   null=True,     

클래스에 따라 데이터베이스 테이블 - models.py
필드 유형
문자열 유형
CharField () # 문자 유형
- 매개 변수: max 필요length 매개 변수, 문자 길이가CharField(max length=10)와 같다는 것을 표시합니다
TextField () 텍스트 유형
EmailField() # Django Admin 및 ModelForm에서 인증 메커니즘 제공
IPAddressField() # Django Admin 및 ModelForm에서 인증 IPV4 메커니즘 제공
GenericIPAddressField(Field) # Django Admin 및 ModelForm에서 검증 Ipv4 및 Ipv6(권장)
URLField() # Django Admin 및 ModelForm에서 인증 URL 제공
SlugField () # Django Admin 및 ModelForm에서 검증 지원 문자, 숫자, 밑줄, 연결부호(빼기 기호) 제공
FilePathField() # Django Admin 및 ModelForm에서 폴더 아래 파일 읽기 기능 제공
- 매개변수:
path, 폴더 경로
match=None, 정규 일치
recursive=False, 아래 폴더로 전송
    allow_파일 허용
    allow_folders=False, 폴더 허용
PS: EmailField,GenericIPAddressField,URLField 등은django-admin에게만 사용할 때 특수 기능이 있습니다. 만약에 admin을 사용하지 않으면CharField와 마찬가지로 일반 문자열을 나타냅니다.
디지털 유형
정형
IntegerField(Field) - 정수열(기호가 있는) - 2147483648~2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) - 양의 정수 0~2147483647
SmallIntegerField(IntegerField): - 정수 -32768~32767
BigIntegerField(IntegerField): - 긴 정수(기호가 있는)-922372036854775808~9223372036854775807
부동점형
  FloatField(Field)
# 10진수 소수점
- 매개변수:
max_digits, 소수점 총 길이
decimal_places, 소수점 길이
BinaryField # 바이너리 유형
부울 값
BooleanField(Field) - 부울 값 유형
NullBooleanField(Field) - 빈 부울 값일 수 있습니다.
* 사용자 정의 추가 열 (모델에 추가 열이 없으면 id라는 열이 자동으로 생성됩니다)
AutoField(primary key=True)는 primary 매개변수를 입력해야 합니다.key=True
시간 유형
DateTimeField(DateField) - 날짜 + 시간 형식 YYYYYY-MMM-DD H:MM [:ss[.uuuuuu]][TZ]
DateField - 날짜 형식 YYYYY-MM-DD
TimeField(DateTime Check Mixin, Field) - 시간 형식 HH:MM[:ss[.uuuuuu]]
DurationField(Field) - 긴 정수, 시간 간격, 데이터베이스에서bigint에 따라 저장되며, ORM에서 얻은 값은datetime입니다.timedelta 유형
필드 속성
null -> db를 비울 수 있는지 여부
default -> 기본값
primary_key-> 주 키
db_column='xxx'-> 열 이름
db_index=True -> 인덱스
unique
  
-> 고유 인덱스
unique_for_date -> 데이터베이스의 필드 [날짜] 부분에 유일한 인덱스를 만들 수 있는지 여부
unique_for_month -> 데이터베이스 필드 [월] 섹션에서 고유한 인덱스를 만들 수 있는지 여부
unique_for_year-> 데이터베이스에서 필드 [년] 부분에 유일한 인덱스를 만들 수 있는지 여부
auto_now_add -> 생성 시 자동 생성 시간
auto_now -> 업데이트 시 현재 시간으로 자동 업데이트
choices  
-> django admin에 탭 조회를 피하기 위해 아래 상자를 표시합니다 (탭 조회 효율이 낮음)
blank -> django admin을 비울 수 있는지 여부
verbose_name -> django admin 표시 필드 중국어
editable -> django admin을 편집할 수 있는지 여부
error_메시지 -> django admin 오류 정보(부족)
help_text -> django admin 프롬프트
validators -> django form 사용자 정의 오류 정보(부족)
예:
from django.db import models
# Create your models here.

class UserInfo(models.Model): 
    #         app01_userinfo
    #       id (  ,  )   
    username = models.CharField(max_length=32,blank=True,verbose_name='   ')        #     ,     ,    
    password = models.CharField(max_length=60, help_text='pwd') 
    email = models.EmailField(max_length=19,null=True,error_messages={'invalid': '     '}
    caption = models.CharField(max_length=32,unique=True)
    user_type_choices = ((1, '    '), (2, '    '),(3, '    '),)   #       
    user_type_id = models.IntegerField(choices=user_type_choices,default=1)
    ctime = models.DateTimeField(auto_now_add=True, null=True)
    mtime = models.DateTimeField(auto_now=True, null=True)
     '''
        : mtime       
     obj=UserInfo.objects.filter(id=1).update(caption='CEO')
        : mtime      
     obj=UserInfo.objects.filter(id=1).first()
     obj.caption = 'CEO'
     obj.save()
     '''

클래스에 따라 데이터베이스 테이블의 데이터에 대해 각종 조작을 진행하다
   
-- views.py
from app01 import models
def orm(request):
    #  
    models.UserInfo.objects.create(username='root',password='123')

    dic = {'username': 'xxx', 'password': '666'}
    models.UserInfo.objects.create(**dic)

    obj = models.UserInfo(username='alex',password='123')
    obj.save()

    #  
    result = models.UserInfo.objects.all()
    result = models.UserInfo.objects.filter(username='root',password='123')
    print(result)  #   Django QuerySet   ,,]>
    for row in result:
        print(row.id,row.username,row.password)

    dic = {'name': 'xxx', 'age_gt': '19'}
    models.User.objects.filter(**dic)

    #  
    models.UserInfo.objects.filter(id=4).delete()

    #  
    models.UserInfo.objects.filter(id=3).update(password="69")

# models.tb.objects.filter(id__gt=1) => select * from tb where id > 1 
# models.tb.objects.filter(id__gte=1) => select * from tb where id >= 1 
# models.tb.objects.filter(id=1) => select * from tb where id = 1 
# models.tb.objects.filter(id__lt=1) => select * from tb where id < 1 
# models.tb.objects.filter(id__lte=1) => select * from tb where id <= 1 
외부 키 구속.
ForeignKey("PrimaryTable",to_filed='xxx')
from django.db import models

# Create your models here.

class UserGroup(model s.Model):
    uid = models.AutoField(primary_key=True)  #      ,    primary_key=True
    caption = models.CharField(max_length=32,unique=True)

class UserInfo(models.Model): 
    username = models.CharField(max_length=32,blank=True,verbose_name='   ')      
   password = models.CharField(max_length=60, help_text='pwd')  
    email = models.CharField(max_length=60)
    user_group = models.ForeignKey("UserGroup",to_field='uid',default=1) 
    # default=1           ,django      user_group     user_group_id,   user_group UserGroup      (uid,caption,ctime,uptime)
from app01 import models
def orm(request):
    models.UserInfo.objects.create(
    username='root1',
    password='123',
    email="[email protected]",
    user_group = models.UserGroup.objects.filter(id=1).first() #   user_group_id = 1 (  ) 
    )


    user_list = Userinfo.objects.all()
    for row in user_list: 
        print(row.user_group) #   user_group   UserGroup   
        print(row.user_group.id)  #     print(row.user_group_uid)
        print(row.user_group.caption)  

예: 사용자 관리
urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^login/', views.login),
    url(r'^index/', views.index),
    url(r'^user_info/', views.user_info),
    url(r'^userdetail-(?P\d+)/', views.user_detail),
    url(r'^userdel-(?P\d+)/', views.user_del),
    url(r'^useredit-(?P\d+)/', views.user_edit),
]

view.py
from django.shortcuts import render,HttpResponse,redirect

def login(request):
    models.UserGroup.objects.create(caption='DBA')

    if request.method == "GET":
        return render(request, 'login.html')
    elif request.method == "POST":
        #        select * from user where usernam='x' and password='x'
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        # count = models.UserInfo.objects.filter(username=u, password=p).count()
        obj = models.UserInfo.objects.filter(username=u, password=p).first()   
        if obj:    
            return redirect('/cmdb/index/')
        else:
            return render(request, 'login.html')
    else: 
        # PUT,DELETE,HEAD,OPTION...
        return redirect('/index/')


def index(request): 
    return render(request, 'index.html')

def user_info(request):
    if request.method == "GET":
        user_list = models.UserInfo.objects.all()  # print(user_list.query)
        group_list = models.UserGroup.objects.all()
        return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list})
    elif request.method == 'POST':
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        return redirect('/cmdb/user_info/')


def user_detail(request, nid):
    obj = models.UserInfo.objects.filter(id=nid).first()
    # models.UserInfo.objects.get(id=nid)  #      ,         
    return render(request, 'user_detail.html', {'obj': obj})

def user_del(request, nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/cmdb/user_info/')

def user_edit(request, nid):
    if request.method == "GET":
        obj = models.UserInfo.objects.filter(id=nid).first()
        return render(request, 'user_edit.html',{'obj': obj})
    elif request.method == "POST":
        nid = request.POST.get('id')
        u = request.POST.get('username')
        p = request.POST.get('password')
        models.UserInfo.objects.filter(id=nid).update(username=u,password=p)
        return redirect('/cmdb/user_info/')

index.html



    
    Title
    


    
Deployment

user_info.html



    
    Title
    


    
Deployment


user_detail.html



    
    Title
    


    
Deployment

{{ obj.id }}
{{ obj.name }}
{{ obj.password }}

user_edit.html



    
    Title
    


    
Deployment

좋은 웹페이지 즐겨찾기