ORM de Django tabla de base de datos única en base a la operación del modelo

ORM de Django tabla de base de datos única en base a la operación del modelo

ORM introducción y uso básico

El ORM, O bject R & lt elational m apping, mapeo objeto-relacional es un método de uso de la base de datos y la llamada en Django. ORM encapsula SQL conexiones y la operación de la base de datos de estados, podemos estar familiarizados con código orientado a objetos a través de las operaciones de ejecución del pitón de la base de datos, sin tener que recordar las sentencias SQL complejas.

ORM simplifica en gran medida el código que nos movemos la base de datos, sino que también podría causar cierta eficiencia. Cómo elegir, mirar las necesidades de las aplicaciones reales.

uso:

  1. carpeta de la aplicación por debajo de la models.pytabla de datos de escritura correspondiente a los archivos de clase, véase el siguiente ejemplo:

    class UserInfo(models.Model):
        id = models.AutoField(primary_key=True)  
        username = models.CharField(max_length=10)
        password = models.CharField(max_length=32)
  2. base de datos MySQL para crear una biblioteca, como orm01 llamado:

    create database orm01;
  3. Hacer la base de datos de configuración, la base de datos se utiliza por defecto ligero SQLite:

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

    Para utilizar la base de datos MySQL, necesitamos settings.pycambios de configuración de base de datos de archivos en el siguiente formato:

    #连接mysql的配置: 
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'orm01',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'USER':'root',
            'PASSWORD':'123'
        }
    }
  4. En la carpeta del proyecto (directorio del proyecto) bajo el __init__.pyarchivo de escribir el siguiente, para especificar pymysqlun cliente conectado. Porque aunque la unidad local ya pymyql está instalado, pero Django MySQL MySQLdb conexión todavía utilizan la unidad predeterminada, pero MySQLdb no soporta Python 3, por lo que la necesidad de configurar manualmente el proyecto.

    import pymysql
    pymysql.install_as_MySQLdb()
  5. Realizar la instrucción de sincronización de base de datos, ejecute el código siguiente en un terminal:

    python manage.py makemigrations  #在migrations文件夹下面生成记录文件
    python manage.py migrate         #执行记录文件

De esta manera, se crea la tabla de datos. Nuestro nombre de tabla por defecto: nombre de la aplicación _ el nombre de la clase en minúsculas.

En la terminal, se puede ver que acabamos de construir una tabla de base de datos a través de los comandos.

1574244736504

ORM de campo corresponde al campo real de las relaciones con MySQL:

'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',

Especificando el nombre de la tabla de datos de nueva creación

A veces, no queremos una tabla llamada el formato por defecto del sistema y, a continuación, se puede mostrar el camino al declarar que indica al sistema lo que el nombre de la tabla es:

from django.db import models

# Create your models here.
class Student(models.Model):
    # 模型字段
    name = models.CharField(max_length=100,verbose_name="姓名")
    sex = models.BooleanField(default=1,verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    class_number = models.CharField(max_length=5,verbose_name="班级编号")
    description = models.TextField(max_length=1000,verbose_name="个性签名")

    class Meta:
        db_table="tb_student"    # 指定表名为tb_student
        verbose_name = "学生"
        verbose_name_plural = verbose_name

Otro efecto de la tabla especificada, si hay una tabla de base de datos y los campos individuales para cumplir con los requisitos, no hay necesidad de que la migración de base de datos también puede utilizar esta tabla.

Supresiones datos de cambio de búsqueda en la tabla

Aumentar (creado)

Guarde el modelo creado por la clase

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

Creando (utilizado) por el método de crear

El valor de retorno es el registro que crea el método del modelo de objeto crear

models.UserInfo.objects.create(
    username='一峰',
    password='666'
)

Modificar (actualizar)

Modificado método de actualización (convencional) por

En primer lugar para encontrar el modelo de objetos de datos que desea modificar y, a continuación, llamar al método de actualización que se desea modificar. actualización sólo querset tipo antes de llamar, modelo de objetos no puede llamar directamente al método de actualización, a fin de utilizar el método get para obtener el objeto no es el momento de la actualización.

models.UserInfo.objects.filter(id=1).update(
    username='alexxx',
    password='bigsb',
)

Por objeto modelo para guardar los cambios (DRF será utilizado)

Si los datos se obtiene mediante el modelo de objetos pueden ser modificados por esta actualización, el modelo de modificación de objetos guardados después de la forma en que el fenómeno de datos.

obj = models.UserInfo.objects.filter(id=1)[0]
obj.username = 'alex222'
obj.password = '11111'
obj.save()

Bulk crear

list_obj = []
for i in range(10):
    obj = models.UserInfo(
        username='xx%s'%i,
        password='66%s'%i,
    )
    list_obj.append(obj)
print(list_obj)
models.UserInfo.objects.bulk_create(list_obj)

update_or_create han actualizado, no se crea

Cabe señalar que los datos sólo se puede encontrar allí ninguna o sólo uno es. Si la condición de los datos es más de un error.

a,b = models.UserInfo.objects.update_or_create(
    username='alex',
    defaults={
        'id':20,
        'password':'ooooo',
        'age':84,
    }
)
print(a)  # 当前更新后的model对象,或者是你新增的记录的model对象
print(b)  # 新增就是True,查询就False

Eliminar

delete() La persona que llama puede ser un método del modelo de objetos, puede ser una colección queryset.

models.UserInfo.objects.filter(id=1).delete()

investigación

Ejemplos de consultas simples

ret = models.UserInfo.objects.filter(id=1)
print(ret) #<QuerySet [<UserInfo: UserInfo object>]> -- []
obj = ret[0]
print(obj.id,obj.username)

Comparación de consulta

Subrayado doble por __la adición de comandos, un simple consulta comparación, dicha determinación no está vacío, ya sea mayor o menor que un cierto valor:

article_list = Article.objects.filter(pub_date__isnull=False, pub_date__lte=datetime.now())

se utilizan comúnmente Tales métodos:

isnull    # 字段为空
lt        # 小于
lte       # 小于等于
gt        # 大于
gte       # da'yu'deng'y

métodos de consulta

Un total de 13 métodos, sabrá será.

all()

Todos los resultados de la consulta, el resultado es el tipo de queryset

ret = models.UserInfo.objects.all()
filter(**kwargs)

Contiene el objeto dado coincide con los criterios del filtro, el resultado es queryset Tipo:

Book.objects.filter(title='linux',price=100)

Una serie de condiciones que están separadas por comas, y estas condiciones se debe establecer, y la relación es, o detrás de nosotros para aprender las relaciones, dirigir escrito aquí está funcionando o es.

Además de dirigirse directamente a los objetos, también se puede utilizar el método de filtro usando queryest:

ret = models.UserInfo.objects.all().filter() 
obtener (** kwargs)

Object para que coincida con el filtro, el tipo no queryset, son objeto filas, y devuelve los resultados , y sólo un objetivo, si cumplen los criterios de filtrado de más de una o ninguna generará un error. Coger la excepción try.

Book.objects.get(id=1)
filtra y compara get
ret = models.UserInfo.objects.get(age=18)
ret = models.UserInfo.objects.filter(age=180)
  • obtener sólo conseguir un pedazo de datos. Si no puede encontrar los datos súper o encontrar dos datos se quejan, obtener una petición para devolver el resultado es que el modelo de objetos más que el conjunto de resultados de consulta:
# 1 UserInfo matching query does not exist. 啥也没查到
# 2 get() returned more than one UserInfo -- it returned 11!  结果多了,不行! 
  • fitler no se da, el resultado es una colección de tipo queryset, llamado un conjunto de resultados, que es un modelo de un objetivo
exclude(**kwargs)

Medios excluidos, el objeto que contenga una condición de filtro dado no coincide, sin operación costosa es igual, con la excluye de esto, el valor de retorno es de tipo queryset.

Book.objects.exclude(id=6)

retorno ID Todos los objetos 6 no es igual.

excluir también puede llamar sobre la base de queryset

Book.objects.all().exclude(id=6)
order_by(field)

Tipo queryset de llamada de datos, ordenar el resultado de la consulta, el valor predeterminado es orden ascendente de acuerdo con el ello, devuelve el valor o tipo queryset:

models.Book.objects.all().order_by('price','id')

Precio de escritura directa, por defecto está dispuesta por orden de precio ascendente. Si desea descendente campo de orden, se escribe un signo menos en la línea, es decir order_by('-price'). order_by('price','id')La condición es una especie múltiple en orden ascendente. Precio a cabo, los mismos datos. Precio, de acuerdo con el id ascendente

reverse()

Tipo de conjunto de consultas de datos para llamar, invertir el orden de los resultados de la consulta, el tipo de valor de retorno o queryset

count()

Tipo queryset de llamada de datos, volver consulta la base de datos para que coincida con el número de objetos (QuerySet) de.

ret = models.UserInfo.objects.all().count()
first()

Tipo queryset de llamada de datos, devuelve el primer registro

Book.objects.all()[0] = Book.objects.all().first()

El modelo resultante es un objeto, no queryset

last()

Tipo queryset de llamada de datos, devuelve el último registro, y un método que utiliza firstel mismo.

exists()

Tipo de conjunto de consultas de datos para llamar, si el QuerySet contiene datos, devuelve True, de lo contrario falso.

tipos de QuerySet vacíos de datos no son también booleano verdadero y falso, pero a veces adecuado para su uso directo para determinar qué datos de la base de datos no está allí. Si usted tiene una gran cantidad de datos, se utilizan para juzgar, entonces usted necesita para comprobar todos los datos, la eficiencia es malo. Con la cuenta o salidas, tales como:

all_books = models.Book.objects.all().exists()

sentencia SQL se traduce en:

SELECT (1) AS a FROM app01_book LIMIT 1

Es a través del límite de 1, echar un vistazo a los datos no están allí, es un rendimiento mucho más alto.

values(*field)

Con más. Tipo queryset de llamada de datos, devuelve un ValueQuerySet-- un QuerySet especial. Después de ejecutar la instancia del objeto no es conseguir una serie de modelo, pero un diccionario puede ser secuencia iterativa. Queryset siempre y cuando el tipo de retorno, se puede continuar con la llamada cadena de otros métodos para encontrar el tipo queryset, otros métodos son los mismos.

queryset llamada:

ret = models.UserInfo.objects.all().values('age','username')

se opone a llamar - el valor de todos los datos fueron los siguientes:

ret = models.UserInfo.objects.values('age','username')
values_list(*field)

Que values()es muy similar, devuelve una secuencia de tuplas, valores de retorno es una secuencia de diccionario

distinct()

tipos de QuerySet de datos y valores obtenidos values_list a la llamada, descartando los duplicados de los resultados de registros devueltos

ret = models.UserInfo.objects.all().values('age','username').distinct()
ret = models.UserInfo.objects.values('age','username').distinct()

MRO crear un formato de hora

Al crear, añadir manera fecha de los datos de campo

models.Book.objects.create(
    publish_date = "2019-08-01",    # 字符串
    # publish_date = datetime.datetime.now(), 时间日期数据
)

和 actualización de eliminación

Cuando los datos de actualización de actualización, solamente queryset tipos de datos:

models.Book.objects.filter(id=2).update(username='xxx')  #update的调用者是queryset类型数据

Cuando los datos de eliminar eliminar, puede utilizar queryset tipos de datos, puede utilizar objetos de datos directos:

models.Book.objects.filter(id=2).delete()
models.Book.objects.get(id=2).delete()

práctica

  1. Preguntas de la prensa ciertos libros de precio que haya sido publicada es mayor que 200
  2. Conoce todos los libros Py nombres que empiezan con agosto del 2017 publicada
  3. Buscar tarifas para los 50.100 ó 150 nombres de todos los libros y su nombre editores
  4. Todos los títulos de los libros de precio entre 100-200 y su precio
  5. Búsqueda de Personas Publishing House publicó libros de precio (de mayor a menor clasificación, de énfasis)

Supongo que te gusta

Origin www.cnblogs.com/shuoliuchina/p/12521553.html
Recomendado
Clasificación