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)