Home

Object-relational mapper

Field types

AutoField 字段自增

BooleanField 布尔字段

CharField 字符串字段

DateField 日期字段

DateTimeField 时间日期字段

DecimalField Decimal字段

EmailField 邮箱字段

FilePathField 文件路径字段

FloatField 浮点字段

IntegerField 整数字段

IPAddressField ip地址字段

GenericIPAddressField ip地址字段

SlugField Slug字段

TextField 文本字段

TimeField 时间字段

URLField url字段

BinaryField 二进制字段

UUIDField uuid字段

field options

verbose_name from表单显示名称

primary_key 主键

max_length 最大长度

blank 是否为null

default 默认值

choices 选择项

db_index 是否创建索引

db_column 列名

unique 是否唯一

editable from表单可编辑

from django.db import models
import datetime
import uuid
from django.utils import timezone

class Person(models.Model):
    id = models.UUIDField( primary_key=True, default=uuid.uuid1())
    # id = models.AutoField(primary_key=True)
    gender = models.CharField(blank=False, db_column="gender", max_length=250, choices=(
        ('female', '男'),
        ('male', '女'),
    ),
                              db_index=True, default="默认值", editable=False,
                              error_messages={'blank': 'INVALID!!11', 'null': 'NULL11!'},
                              help_text="Please use the following format: <em>YYYY-MM-DD</em>.",
                              primary_key=False, unique=False
                              )
    age = models.IntegerField(default=0)
    email = models.EmailField(default="kastrcn@outlook.com")
    birthday = models.DateField(default=datetime.date.today)
    create_at = models.DateTimeField(verbose_name="创建时间", default=timezone.now)
    class Meta:
        db_table = 'user'
        # abstract = True
        ordering = ['-gender']

表关系

一对多关联

class BookInfo(models.Model):
    pass
#定义英雄模型类HeroInfo
class HeroInfo(models.Model):
    hbook = models.ForeignKey('BookInfo')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中

一对一关联

class Place(models.Model):
    pass
class Restaurant(models.Model):
    place = models.OneToOneField(Place, on_delete=models.CASCADE,primary_key=True)

多对多关联

class TypeInfo(models.Model):
	pass
class NewsInfo(models.Model):
  ntype = models.ManyToManyField('TypeInfo')

自关联

class AreaInfo(models.Model):
    atitle=models.CharField(max_length=30)#名称
    aParent=models.ForeignKey('self',null=True,blank=True)#关系

QuerySets

查询最后一条记录 返回model对象 Role.objects.last()

查询第一条记录 返回model对象 Role.objects.first()

获取主键为1的记录 返回model对象 Role.objects.get(pk=1)

查询id等于1的记录 返回model对象集合 Role.objects.filter(id=1)

查询id等于1 name等于默认角色的记录 返回model对象集合 Role.objects.filter(id=1, name="默认角色")

查询id等于1 name等于默认角色的记录 返回键值对集合 Role.objects.filter(id=1, name="默认角色").values()

查询id等于1 name等于默认角色的记录 返回只包含id的键值对集合 Role.objects.filter(id=1, name="默认角色").values('id')

查询Role所有id 返回id元组集合 Role.objects.values_list("id")

查询Role所有id 返回id元组集合 以id倒叙排序 Role.objects.values_list("id").order_by('-id')

查询Role所有id 根据id去重 返回id元组集合 Role.objects.distinct("id").values_list("id")

查询Role所有id 根据id去重 返回id元组集合 Role.objects.values_list("id").order_by('-id').distinct('id')

values和values_list

>>> Role.objects.values("id","name")
<QuerySet [{'id': 1, 'name': '默认角色'}, {'id': 2, 'name': '默认角色'}, {'id': 3, 'name': '默认角色'}, {'id': 4, 'name': '默认角色'}]>
Role.objects.values("id","name")[0]["id"]
<class 'dict'>


>>> Role.objects.values_list("id","name")
<QuerySet [(1, '默认角色'), (2, '默认角色'), (3, '默认角色'), (4, '默认角色')]>
Role.objects.values_list("id", "name")[0][0]
<class 'tuple'>

QuerySet转SQL

print(Role.objects.values_list("id", "name").query)
str(Role.objects.values_list("id", "name").query)
# SELECT "app_role"."id", "app_role"."name" FROM "app_role"

flat字段 多个字段无效

>>> Entry.objects.values_list('id').order_by('id')
<QuerySet[(1,), (2,), (3,), ...]>

>>> Entry.objects.values_list('id', flat=True).order_by('id')
<QuerySet [1, 2, 3, ...]>

json序列化

from django.core import serializers
serialized_obj = serializers.serialize('json', [user, ])