Operación de la base de datos Django-03

base de datos

1. Defina la clase de modelo

Defina la clase de modelo en models.py, heredada de modelos.

from django.db import models

# Create your models here.

class 模型类A(models.Model):
    # 创建字段,字段类型...
    name = models.CharField(max_length=10)

class 模型类B(models.Model):
    gender = models.BooleanField()
    # 外键约束(B中某物属于A中某类)
    book = models.ForeignKey(模型类A,on_delete=models.CASCADE)

Optimización de la clase de modelo

class 模型类A(models.Model):
    name = models.CharField(max_length=10)
  # ------------------------------------------
    def __str__(self):
        """将模型类以字符串的方式输出"""
        return self.name

1) Clave principal

Django creará una columna de clave primaria de crecimiento automático para la tabla. Cada modelo solo puede tener una columna de clave primaria. Si la opción establece un determinado atributo como la columna de clave primaria, Django ya no creará una columna de clave primaria de crecimiento automático.

El atributo de la columna de clave primaria creada por defecto es id, que puede ser reemplazado por pk (clave primaria para pantalla completa)

2) Restricciones de nombres de propiedades

No puede ser una palabra clave reservada de Python

No se permiten guiones bajos continuos (decidido por el método de consulta de django)

Al definir atributos, debe especificar el tipo de campo, sintaxis: atributo = modelos. Tipo de campo (opción)

Tipo de campo

Tipo Descripción
AutoField aumento automático IntegerField, generalmente no especificado, Django creará automáticamente una propiedad llamada id atributo aumenta automáticamente cuando no especifica
BooleanField Campo booleano, un valor de True o False
NullBooleanField soporta Null, True, False tres valores
CharField string, max_length parámetro indica el número máximo de caracteres
TextField campos de texto grandes, usados ​​típicamente en exceso de 4000 caracteres
IntegerField entero
DecimalField punto flotante decimal, representa el número total de bits parámetro max_digits, los bits de parámetro representan la fracción decimal_places
FloatField float
DateField fecha, cada uno representa un parámetro auto_now Al guardar el objeto, este campo se configura automáticamente a la hora actual, que se utiliza para la marca de tiempo de la "última modificación". Siempre usa la fecha actual y el valor predeterminado es False; el parámetro auto_now_add significa que la hora actual se establece automáticamente cuando se crea el objeto por primera vez. La marca de tiempo utilizada para crear, siempre usa la fecha actual, el valor predeterminado es Falso; los parámetros auto_now_add y auto_now son mutuamente excluyentes, la combinación causará un error.
TimeField time, el parámetro es el mismo que DateField
DateTimeField fecha y hora, el parámetro es el mismo que DateField
FileField campo de archivo de carga
ImageField Heredado de FileField, verifique el contenido cargado para asegurarse de que sea una imagen válida

Opciones

Opción descripción
nulo Si es Verdadero, se permite que esté en blanco, el valor predeterminado es Falso en
blanco Si es Verdadero, se permite que el campo esté en blanco, el valor predeterminado es Falso
db_column nombre del campo, si no se especifica, se usa el nombre del atributo
db_index Si el valor es Verdadero, se creará un índice para este campo en la tabla, el valor predeterminado es Falso
default default
primary_key Si es Verdadero, el campo se convertirá en el campo de clave principal del modelo, el valor predeterminado es False, generalmente se usa como una opción de AutoField
único Si es Verdadero, este campo debe tener un valor único en la tabla, el valor predeterminado es Falso

Clave externa

Al configurar la clave externa, debe especificar la opción on_delete para especificar cómo tratar los datos en la tabla de referencia de clave externa cuando la tabla principal elimina datos. Django.db.models contiene constantes opcionales:

  • Cascada en cascada, elimine los datos en la tabla de clave externa juntos al eliminar los datos de la tabla principal
  • PROTEGER la protección, lanzando una excepción ProtectedError, para evitar la eliminación de los datos en la tabla principal que aplica la clave externa
  • SET_NULL se establece en NULL, solo disponible cuando el campo nulo = Verdadero permite nulo
  • SET_DEFAULT se establece en el valor predeterminado, solo disponible cuando el campo se establece en el valor predeterminado
  • SET () se establece en un valor específico o llama a un método específico
  • DO_NOTHING no hace nada. Si la base de datos indica en cascada de antemano, esta opción lanzará una excepción IntegrityError

2. Configurar la base de datos

La base de datos sqlite se usa por defecto en setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Usar la base de datos mysql

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',  # 数据库主机
        'PORT': 3306,  # 数据库端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': 'mysql',  # 数据库用户密码
        'NAME': 'book'  # 数据库名字
    }
}

3. Migración de modelos

Generar archivo de migración: generar declaración de creación de tabla basada en la clase de modelo

python manage.py makemigrations

Realizar migración: crear una tabla en la base de datos de acuerdo con la declaración generada en el primer paso

python manage.py migrate

4. Ejecute la prueba

Necesita instalar el controlador del cliente de la base de datos MySQL

pip install mysqlclient==1.4.6 -i https://pypi.tuna.tsinghua.edu.cn/simple/

Si aún informa un error, debe instalar libmysqlclient-dev (en la máquina virtual)

sudo apt-get install libmysqlclient-dev

5. Operaciones de base de datos

incrementar

1) guardar

>>> from 子应用名.models import 类名
>>> 对象a = 模型类A(
...         name='python入门',
...         pub_date='2010-1-1'
...     )
>>> 对象a.属性1 = 属性值
>>> 对象a.属性2 = 属性值
>>> 对象a.save()

2) crear

>>> 模型类A.objects.create(
...         name='itheima',
...         book=book
...     )

cambio

1) guardar

Modifique los atributos del objeto de clase de modelo y luego ejecute save ()

>>> 对象a = 模型类A.objects.get(属性='原信息')
>>> 对象a.属性 = '新信息'
>>> 对象a.save()

2) actualización

>>> 模型类A.objects.filter(属性='原信息').update(属性='新信息')

Eliminar

1) Eliminar objeto de clase de modelo

>>> 对象a = 模型类A.objects.get(属性='信息')
>>> 对象a.delete()

2) Modelo class.objects.filter (). Delete ()

>>> 模型类A.objects.filter(属性='信息').delete()

controlar

Consulta básica

1) Obtener un único resultado de la consulta, si no existe, arrojará una clase modelo. Excepción DoesNotExist

>>> 模型类A.objects.get(属性=信息)

2) todas las consultas de resultados múltiples

>>> 模型类A.objects.all()

3) contar la cantidad de consultas

>>> 模型类A.objects.count()

4) filtrar todas las consultas

>>> 模型类A.objects.filter()

5) exclude () no es igual a negación

>>> 模型类A.objects.exclude()

Consulta de filtro

属性名称__比较运算符=值
# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)

               比较运算符                  	      功能       	      举例      
               exact                  	      相等       	  可简写为:id=1   
              contains                	     是否包含      	__contains='传'
        startswith、endswith           	    指定开头或结尾    	__endswith='部'
               isnull                 	     是否为空      	__isnull=True 
                 in                   	    是否在范围内     	 __in=[1,3,5] 
           gt,gte,lt,lte              	大于,大于等于,小于,小于等于	    __gt=3    

año, mes, día, día de la semana, hora, minuto, segundo tipo de fecha y hora __year = 1980

Ejemplo: libros de consultas publicados después del 1 de enero de 1990.

>>> BookInfo.objects.filter(pub_date__gt='1990-1-1')

F Realizar la comparación entre atributos

from django.db.models import F,Q
# 阅读量大于等于2倍评论量
BookInfo.objects.filter(breade__gte = F('bcomment'))

Q implementa no y o en mysql

Función de símbolo
& y
| o
~ no

Función agregada.aggregate ()

Devolver un diccionario

Promedio La
cantidad de recuento promedio generalmente no se usa, use directamente el recuento ()
Máx. Máx. Agregado (Máx. ('Atributo'))
Mín. Mín.
Suma de suma

Sort.order_by ()

Orden ascendente: .order_by ('atributo')

Orden descendente: .order_by ('- atributo rd')

Consulta asociada

Obtener los datos correspondientes a 1

# 1的对象.多的模型类小写_set.all()
bookinfo.heroinfo_set.all()

Obtener los datos del lado con más 1 correspondiente

# 直接使用外键
heroinfo.bookinfo
heroinfo.bookinfo_id

Consulta de filtro relacionada

Query hero son los libros de Guo Jing

bookinfo.object.filter(heroinfo__name='郭靖')

La descripción del libro de consultas contiene 'palm'

bookinfo.objects.filter(heroinfo__desc__contains='掌')

La condición del modelo con más consultas es juzgar los atributos de un lado

La condición usa el diccionario de la clase de modelo asociada 1 el nombre de clave externa de la clase de modelo __1 el nombre de atributo de la clase de modelo __ operador condicional = valor

Consulta a todos los héroes de los ocho dragones.

heroinfo.objects.filter(book_title='天龙八部')

Ver la ubicación del registro de MySQL

cat mysql.log

QuerySet

1. Ejecución perezosa

La creación de un conjunto de consultas no accederá a la base de datos y no accederá a la base de datos hasta que se llame. Las condiciones de llamada incluyen iteración, serialización y uso combinado con if.

books = bookinfo.objects.all() # 这时查看MySQL日志发现没有执行

for b in books:
	print(b.title) # 执行了语句

2. Caché

Al usar un conjunto de consultas, se producirá una consulta a la base de datos la primera vez que se use, y luego Django almacenará en caché los resultados y usará los datos almacenados en caché cuando vuelva a usar este conjunto de consultas, lo que reducirá el número de consultas a la base de datos.

Caso 1: cada consulta interactúa con la base de datos, lo que aumenta la carga en la base de datos

for i in hero.object.all():
    print(i.name)
for i in hero.object.all():
    print(i.name)

Caso 2: después del almacenamiento, el conjunto de consultas se puede reutilizar y los datos en la caché se pueden usar por segunda vez

heros = heroinfo.object.all()
for i in heros:
    print(i.name)
for i in heros:
    print(i.name)

Supongo que te gusta

Origin blog.csdn.net/weixin_47761086/article/details/115377875
Recomendado
Clasificación