Django中models字段含义、用法

django的Models用法 模型是关于您的数据的单一的、确定的信息来源。它包含您存储的数据的基本字段和行为。通常,每个模型映射到单个数据库表。 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model 模型类的每个属性都相当于一个数据库的字段。 综上诉说,Django 给你一个自动生成访问数据库的 API;请参阅 Making queries。 简单的例子 ... 阅读详情

Model

一、model基本结构

1.字段名称、含义


AutoField(Field)
    # int自增列,必须填入参数 primary_key=True

BigAutoField(AutoField)
    # bigint自增列,必须填入参数 primary_key=True

    注:当model中如果没有自增列,则自动会创建一个列名为id的列
    from django.db import models

    class UserInfo(models.Model):
        # 自动创建一个列名为id的且为自增的整数列
        username = models.CharField(max_length=32)

    class Group(models.Model):
        # 自定义自增列
        nid = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)

SmallIntegerField(IntegerField):
    # 小整数 -32768 ~ 32767

PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    # 正小整数 0 ~ 32767
IntegerField(Field)
    # 整数列(有符号的) -2147483648 ~ 2147483647

PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    # 正整数 0 ~ 2147483647

BigIntegerField(IntegerField):
    # 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807

自定义无符号整数字段

    class UnsignedIntegerField(models.IntegerField):
        def db_type(self, connection):
            return 'integer UNSIGNED'

    PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
        '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)',

BooleanField(Field)
    # 布尔值类型

NullBooleanField(Field):
    # 可以为空的布尔值

CharField(Field)
    # 字符类型
    # 必须提供max_length参数, max_length表示字符长度

TextField(Field)
    # 文本类型

EmailField(CharField):
    # 字符串类型,Django Admin以及ModelForm中提供验证机制

IPAddressField(Field)
    # 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制

GenericIPAddressField(Field)
    # 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
    # 参数:
        protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
        unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"

URLField(CharField)
    # 字符串类型,Django Admin以及ModelForm中提供验证 URL

SlugField(CharField)
    # 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)

CommaSeparatedIntegerField(CharField)
    # 字符串类型,格式必须为逗号分割的数字

UUIDField(Field)
    # 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

FilePathField(Field)
    # 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
    # 参数:
            path,                      文件夹路径
            match=None,                正则匹配
            recursive=False,           递归下面的文件夹
            allow_files=True,          允许文件
            allow_folders=False,       允许文件夹

FileField(Field)
    # 字符串,路径保存在数据库,文件上传到指定目录
    # 参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage

ImageField(FileField)
    # 字符串,路径保存在数据库,文件上传到指定目录
    # 参数:
        upload_to = ""      上传文件的保存路径
        storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
        width_field=None,   上传图片的高度保存的数据库字段名(字符串)
        height_field=None   上传图片的宽度保存的数据库字段名(字符串)

DateTimeField(DateField)
    # 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
    # 日期格式      YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
    # 时间格式      HH:MM[:ss[.uuuuuu]]

DurationField(Field)
    # 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

FloatField(Field)
    # 浮点型

DecimalField(Field)
    # 10进制小数
    # 参数:
        max_digits,小数总长度
        decimal_places,小数位长度

BinaryField(Field)
    # 二进制类型

字段

2.参数含义

null                数据库中字段是否可以为空
db_column           数据库中字段的列名
db_tablespace
default             数据库中字段的默认值
primary_key         数据库中字段是否为主键
db_index            数据库中字段是否可以建立索引
unique              数据库中字段是否可以建立唯一索引
unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
unique_for_year     数据库中字段【年】部分是否可以建立唯一索引

verbose_name        Admin中显示的字段名称
blank               Admin中是否允许用户输入为空
editable            Admin中是否可以编辑
help_text           Admin中该字段的提示信息
choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                    如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)

error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                    字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                    如:{'null': "不能为空.", 'invalid': '格式错误'}

validators          自定义错误验证(列表类型),从而定制想要的验证规则
                    from django.core.validators import RegexValidator
                    from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
                    MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
                    如:
                        test = models.CharField(
                            max_length=32,
                            error_messages={
                                'c1': '优先错信息1',
                                'c2': '优先错信息2',
                                'c3': '优先错信息3',
                            },
                            validators=[
                                RegexValidator(regex='root_\d+', message='错误了', code='c1'),
                                RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
                                EmailValidator(message='又错误了', code='c3'), ]
                        )

3.元信息Meta(干预数据库建表名等操作)

class UserInfo(models.Model):
        nid = models.AutoField(primary_key=True)
        username = models.CharField(max_length=32)
        class Meta:
            # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
            db_table = "table_name"

            # 联合索引
            index_together = [
                ("pub_date", "deadline"),
            ]

            # 联合唯一索引
            unique_together = (("driver", "restaurant"),)

            # 后台管理界面,admin中显示的表名称
            verbose_name

            # verbose_name加s   (复数显示)
            verbose_name_plural
        
    更多:https://docs.djangoproject.com/en/1.10/ref/models/options/

4.扩展

  • 钩子函数,触发model验证,错误提示
  • form验证(error_messages不是一定非得定义,框架自带的信息也足够判断。)
1.触发Model中的验证和错误提示有两种方式:
    a. Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示,如果都成功,才来检查Model的字段并显示指定错误信息
    b. 调用Model对象的 "clean_fields" 方法,如:
        # models.py
        class UserInfo(models.Model):
            nid = models.AutoField(primary_key=True)
            username = models.CharField(max_length=32)

            email = models.EmailField(error_messages={'invalid': '格式错了.'})

        # views.py
        def index(request):
            obj = models.UserInfo(username='11234', email='uu')
            try:
                print(obj.clean_fields())
            except Exception as e:
                print(e)
            return HttpResponse('ok')

       # Model的clean方法是一个钩子,可用于定制操作,如:上述的异常处理。

2.Admin中修改错误提示
    # admin.py
    from django.contrib import admin
    from model_club import models
    from django import forms


    class UserInfoForm(forms.ModelForm):
        username = forms.CharField(error_messages={'required': '用户名不能为空.'})
        email = forms.EmailField(error_messages={'invalid': '邮箱格式错误.'})
        age = forms.IntegerField(initial=1, error_messages={'required': '请输入数值.', 'invalid': '年龄必须为数值.'})

        class Meta:
            model = models.UserInfo
            # fields = ('username',)
            fields = "__all__"


    class UserInfoAdmin(admin.ModelAdmin):
        form = UserInfoForm


    admin.site.register(models.UserInfo, UserInfoAdmin)


二、连表结构 *****

  • 一对多:models.ForeignKey(其他表)
  • 多对多:models.ManyToManyField(其他表)
  • 一对一:models.OneToOneField(其他表)

1.字段以及参数

ForeignKey(ForeignObject) # ForeignObject(RelatedField)
        to,                         # 要进行关联的表名
        to_field=None,              # 要关联的表中的字段名称
        on_delete=None,             # 当删除关联表中的数据时,当前表与其关联的行的行为,可设置为如下值:
        # 具体的解释可见下边的解释:
                                        - models.CASCADE,删除关联数据,与之关联也删除
                                        - models.DO_NOTHING,删除关联数据,引发错误IntegrityError
                                        - models.PROTECT,删除关联数据,引发错误ProtectedError
                                        - models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
                                        - models.SET_DEFAULT,删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
                                        - models.SET,删除关联数据,
                                                      a. 与之关联的值设置为指定值,设置:models.SET(值)
                                                      b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

                                                        def func():
                                                            return 10

                                                        class MyModel(models.Model):
                                                            user = models.ForeignKey(
                                                                to="User",
                                                                to_field="id"
                                                                on_delete=models.SET(func),)
        related_name=None,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
        related_query_name=None,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
        limit_choices_to=None,      # 在Admin或ModelForm中显示关联数据时,提供的条件:
                                    # 如:
                                            - limit_choices_to={'nid__gt': 5}
                                            - limit_choices_to=lambda : {'nid__gt': 5}

                                            from django.db.models import Q
                                            - limit_choices_to=Q(nid__gt=10)
                                            - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
                                            - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
        db_constraint=True          # 是否在数据库中创建外键约束
        parent_link=False           # 在Admin中是否显示关联数据


    OneToOneField(ForeignKey)
        to,                         # 要进行关联的表名
        to_field=None               # 要关联的表中的字段名称
        on_delete=None,             # 当删除关联表中的数据时,当前表与其关联的行的行为

                                    ###### 对于一对一 ######
                                    # 1. 一对一其实就是 一对多 + 唯一索引
                                    # 2.当两个类之间有继承关系时,默认会创建一个一对一字段
                                    # 如下会在A表中额外增加一个c_ptr_id列且唯一:
                                            class C(models.Model):
                                                nid = models.AutoField(primary_key=True)
                                                part = models.CharField(max_length=12)

                                            class A(C):
                                                id = models.AutoField(primary_key=True)
                                                code = models.CharField(max_length=1)

    ManyToManyField(RelatedField)
        to,                         # 要进行关联的表名
        related_name=None,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
        related_query_name=None,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
        limit_choices_to=None,      # 在Admin或ModelForm中显示关联数据时,提供的条件:
                                    # 如:
                                            - limit_choices_to={'nid__gt': 5}
                                            - limit_choices_to=lambda : {'nid__gt': 5}

                                            from django.db.models import Q
                                            - limit_choices_to=Q(nid__gt=10)
                                            - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
                                            - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
        symmetrical=None,           # 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
                                    # 做如下操作时,不同的symmetrical会有不同的可选字段
                                        models.BB.objects.filter(...)

                                        # 可选字段有:code, id, m1
                                            class BB(models.Model):

                                            code = models.CharField(max_length=12)
                                            m1 = models.ManyToManyField('self',symmetrical=True)

                                        # 可选字段有: bb, code, id, m1
                                            class BB(models.Model):

                                            code = models.CharField(max_length=12)
                                            m1 = models.ManyToManyField('self',symmetrical=False)

        through=None,               # 自定义第三张表时,使用字段用于指定关系表
        through_fields=None,        # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
                                        from django.db import models

                                        class Person(models.Model):
                                            name = models.CharField(max_length=50)

                                        class Group(models.Model):
                                            name = models.CharField(max_length=128)
                                            members = models.ManyToManyField(
                                                Person,
                                                through='Membership',
                                                through_fields=('group', 'person'),
                                            )

                                        class Membership(models.Model):
                                            group = models.ForeignKey(Group, on_delete=models.CASCADE)
                                            person = models.ForeignKey(Person, on_delete=models.CASCADE)
                                            inviter = models.ForeignKey(
                                                Person,
                                                on_delete=models.CASCADE,
                                                related_name="membership_invites",
                                            )
                                            invite_reason = models.CharField(max_length=64)
        db_constraint=True,         # 是否在数据库中创建外键约束
        db_table=None,              # 默认创建第三张表时,数据库中表的名称


摘自Stack overflow网友的回答:

This is the behaviour to adopt when the referenced object is deleted. It is not specific to django, this is an SQL standard.

There are 6 possible actions to take when such event occurs:

CASCADE: When the referenced object is deleted, also delete the objects that have references to it (When you remove a blog post for instance, you might want to delete comments as well). SQL equivalent: CASCADE.
PROTECT: Forbid the deletion of the referenced object. To delete it you will have to delete all objects that reference it manually. SQL equivalent: RESTRICT.

SET_NULL: Set the reference to NULL (requires the field to be nullable). For instance, when you delete a User, you might want to keep the comments he posted on blog posts, but say it was posted by an anonymous (or deleted) user. SQL equivalent: SET NULL.

SET_DEFAULT: Set the default value. SQL equivalent: SET DEFAULT.

SET(...): Set a given value. This one is not part of the SQL standard and is entirely handled by Django.

DO_NOTHING: Probably a very bad idea since this would create integrity issues in your database (referencing an object that actually doesn’t exist). SQL equivalent: NO ACTION.

Source: Django documentation

See also the documentation of PostGreSQL for instance.

In most cases, CASCADE is the expected behaviour, but for every ForeignKey, you should always ask yourself what is the expected behaviour in this situation. PROTECT and SET_NULL are often useful. Setting CASCADE where it should not, can potentially delete all your database in cascade, by simply deleting a single user.


三、表的操作(正向查询按字段,反向查询按表名)

1.基本操作(增、删、改、查)

# 增
models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs

obj = models.Tb1(c1='xx', c2='oo')
obj.save()  # 记得调用save方法,保存到数据库。

# 查
models.Tb1.objects.get(id=123)         # 获取单条数据,不存在则报错(不建议)
models.Tb1.objects.all()               # 获取全部
models.Tb1.objects.filter(name='seven') # 获取指定条件的数据,返回数据列表,没有返回空列表[]

# 删
models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据

# 改
models.Tb1.objects.filter(name='seven').update(gender='0')  # 将指定条件的数据更新,均支持 **kwargs
# obj = models.Tb1.objects.get(id=1)
# obj.c1 = '111'
# obj.save()                                                 # 修改单条数据

2.表操作进阶(牛逼的 双下划线 __ )

利用 双下划线 和 _set 将表之间的操作连接起来

# 获取个数
models.Tb1.objects.filter(name='seven').count()

# 大于,小于
models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
models.Tb1.objects.filter(id__gte=1)              # 获取id大于等于1的值
models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
models.Tb1.objects.filter(id__lte=10)             # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值

# in
models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

# isnull
Entry.objects.filter(pub_date__isnull=True)

# contains包含
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven")

# range范围
models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and

# 其他类似
startswith,istartswith, endswith, iendswith,

# order by排序
models.Tb1.objects.filter(name='seven').order_by('id')    # asc正序
models.Tb1.objects.filter(name='seven').order_by('-id')   # desc倒序

# group by
from django.db.models import Count, Min, Max, Sum
models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
等价于SQL语句:SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

# limit 、offset
models.Tb1.objects.all()[10:20]

# regex正则匹配,iregex 不区分大小写
Entry.objects.get(title__regex=r'^(An?|The) +')
Entry.objects.get(title__iregex=r'^(an?|the) +')

# date
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

# year
Entry.objects.filter(pub_date__year=2005)
Entry.objects.filter(pub_date__year__gte=2005)

# month
Entry.objects.filter(pub_date__month=12)
Entry.objects.filter(pub_date__month__gte=6)

# day
Entry.objects.filter(pub_date__day=3)
Entry.objects.filter(pub_date__day__gte=3)

# week_day
Entry.objects.filter(pub_date__week_day=2)
Entry.objects.filter(pub_date__week_day__gte=2)

# hour
Event.objects.filter(timestamp__hour=23)
Event.objects.filter(time__hour=5)
Event.objects.filter(timestamp__hour__gte=12)

# minute
Event.objects.filter(timestamp__minute=29)
Event.objects.filter(time__minute=46)
Event.objects.filter(timestamp__minute__gte=29)

# second
Event.objects.filter(timestamp__second=31)
Event.objects.filter(time__second=2)
Event.objects.filter(timestamp__second__gte=31)
# 例子
get示例:
    # 例:查询图书id为3的图书信息。
    # 注意这里有且只有一个才行,多了或者没有都会报错
    BookInfo.objects.get(id=3)

all方法示例:
    # 例:查询图书所有信息。
    BookInfo.objects.all()

filter方法示例:
    """
    条件格式:(双下划线)
        模型类属性名__条件名=值
    """
    查询图书评论量为34的图书的信息:
    a)判等 条件名:exact。
        # 例:查询编号为1的图书。
        BookInfo.objects.get(id=1)
    b)模糊查询(相当于sql的 like)
        # 例:查询书名包含'传'的图书。contains
        BookInfo.objects.filter(btitle__contains='传')
        # 例:查询书名以'部'结尾的图书 endswith 开头:startswith
        BookInfo.objects.filter(btitle__endswith='部')
    c)空查询 isnull
        # 例:查询书名不为空的图书。isnull 
        select * from booktest_bookinfo where btitle is not null;
        BookInfo.objects.filter(btitle__isnull=False)
    d)范围查询 in
        # 例:查询id为1或3或5的图书。
        select * from booktest_bookinfo where id in (1,3,5);
        BookInfo.objects.filter(id__in = [1,3,5])
    e)比较查询 gt(greate than) lt(less  than) gte(equal)大于等于   lte小于等于
        # 例:查询id大于3的图书。
        Select * from booktest_bookinfo where id>3;
        BookInfo.objects.filter(id__gt=3)
    f)日期查询
        # 例:查询1980年发表的图书。
        BookInfo.objects.filter(bpub_date__year=1980)
        # 例:查询1980年1月1日后发表的图书。
        from datetime import date
        BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))

exclude方法示例:
    # 例:查询id不为3的图书信息。
    BookInfo.objects.exclude(id=3)
    
order_by方法示例:
    作用:进行查询结果进行排序。默认是升序,在条件里加“-”表示降序
    # 例:查询所有图书的信息,按照id从小到大进行排序。
    BookInfo.objects.all().order_by('id')
    # 例:查询所有图书的信息,按照id从大到小进行排序。
    BookInfo.objects.all().order_by('-id')
    # 例:把id大于3的图书信息按阅读量从大到小排序显示。
    BookInfo.objects.filter(id__gt=3).order_by('-bread')

3.其他

# extra
#
extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])

# F对象
#
from django.db.models import F
models.Tb1.objects.update(num=F('num')+1)


# Q对象
#
# 方式一:
Q(nid__gt=10)
Q(nid=8) | Q(nid__gt=10)
Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
# 方式二:
con = Q()
q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))
q1.children.append(('id', 10))
q1.children.append(('id', 9))
q2 = Q()
q2.connector = 'OR'
q2.children.append(('c1', 1))
q2.children.append(('c1', 10))
q2.children.append(('c1', 9))
con.add(q1, 'AND')
con.add(q2, 'AND')

models.Tb1.objects.filter(con)


# 执行原生SQL
#
from django.db import connection, connections
cursor = connection.cursor()  # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()

4.联表操作(利用 双下划线 __ )

  • Model表结构实例
class UserProfile(models.Model):
    user_info = models.OneToOneField('UserInfo')
    username = models.CharField(max_length=64)
    password = models.CharField(max_length=64)

    def __unicode__(self):
        return self.username


class UserInfo(models.Model):
    user_type_choice = (
        (0, u'普通用户'),
        (1, u'高级用户'),
    )
    user_type = models.IntegerField(choices=user_type_choice)
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32)
    address = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name


class UserGroup(models.Model):

    caption = models.CharField(max_length=64)

    user_info = models.ManyToManyField('UserInfo')

    def __unicode__(self):
        return self.caption


class Host(models.Model):
    hostname = models.CharField(max_length=64)
    ip = models.GenericIPAddressField()
    user_group = models.ForeignKey('UserGroup')

    def __unicode__(self):
        return self.hostname

1. 一对一操作
user_info_obj = models.UserInfo.objects.filter(id=1).first()
print(user_info_obj.user_type)
print(user_info_obj.get_user_type_display())
print(user_info_obj.userprofile.password)
 
user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
print(user_info_obj.keys())
print(user_info_obj.values())
2.一对多
  • 类似一对一
    • 1、搜索条件使用 __连接
    • 2、获取值时使用 . 连接
3.多对多
user_info_obj = models.UserInfo.objects.get(name=u'武沛齐')
user_info_objs = models.UserInfo.objects.all()

group_obj = models.UserGroup.objects.get(caption='CEO')
group_objs = models.UserGroup.objects.all()

-------------------------------------------------------------
# 添加数据
group_obj.user_info.add(user_info_obj)
group_obj.user_info.add(*user_info_objs)  # 注意星号

# 删除数据
group_obj.user_info.remove(user_info_obj)
group_obj.user_info.remove(*user_info_objs)

# 添加数据
user_info_obj.usergroup_set.add(group_obj)
user_info_obj.usergroup_set.add(*group_objs)

# 删除数据
user_info_obj.usergroup_set.remove(group_obj)
user_info_obj.usergroup_set.remove(*group_objs)

# 获取数据
print group_obj.user_info.all()
print group_obj.user_info.all().filter(id=1)

# 获取数据
print user_info_obj.usergroup_set.all()  # __set
print user_info_obj.usergroup_set.all().filter(caption='CEO')
print user_info_obj.usergroup_set.all().filter(caption='DBA')

5.扩展(上传文件)

  • 自定义文件上传
def upload_file(request):
    if request.method == "POST":
        obj = request.FILES.get('fafafa')
        f = open(obj.name, 'wb')
        for chunk in obj.chunks():  # chunks函数将收到的数据分块
            f.write(chunk)
        f.close()
    return render(request, 'file.html')
  • Form上传文件实例
# Form
class FileForm(forms.Form):
    ExcelFile = forms.FileField()
    
# Model
from django.db import models

class UploadFile(models.Model):
    userid = models.CharField(max_length = 30)
    file = models.FileField(upload_to = './upload/')
    date = models.DateTimeField(auto_now_add=True)
    
# View
def UploadFile(request):
    uf = AssetForm.FileForm(request.POST,request.FILES)
    if uf.is_valid():
            upload = models.UploadFile()
            upload.userid = 1
            upload.file = uf.cleaned_data['ExcelFile']
            upload.save()
            
            print upload.file

6. 批量删除

  • 一般删除: models.SyncRecord.objects.filter(create_time__lte=clear_timestamp).delete() 根据过滤出来的数据直接调用删除
  • 当有page、limit在内时django是不支持进行直接的批量操作的
    • 可以利用子查询:
    models.SyncRecord.objects.filter(
            pk__in=(models.SyncRecord.objects.order_by('create_time').values_list('pk')[:5])
    ).delete()
    
    # django ORM 利用列表切片来实现sql中的page/limit操作,在利用orm生成sql时,会自动将其转换为page/limit
    
    • 但是低版本mysql(如:5.7.2)不支持这种查询,可转换为:
    id_query_set = models.SyncRecord.objects.order_by('create_time')[:clear_count].values_list('id')
    # django获取到的都是个queryset对象
    clear_id_list = [int(i[0]) for i in id_query_set]
    models.SyncRecord.objects.filter(id__in=clear_id_list).delete()
    
6.5、Django -通过Models中JSONField来创建含JSON字段的MySQL表详解 在6.4中介绍了通过在MySQL中创建JSON字段来驱动Django的Models,从而生成JSONField,然而,会出现一些问题,原因是Django中没有JSONField(),系统会默认JSON的字段整为TextField()形式,也许这样对结果不会造成什么影响,然而,心里也很别扭,有个疙瘩,总觉得不完美,有一个梗,总觉得是一个BUG!那么,这次,终极BOSS来啦。下面就开始说,如何通过Dj... 阅读详情

相关推荐

艾德克斯电子负载IT8510维修

2年前从朋友那收了这台艾德克斯电子负载,收来的时候上面的编码器就不好用,就是旋转的时候一会增加一会减小这种现象,不过其他功能都是正常的,自己也就将就用这。直到昨天,电子负载开机发现空载的时候电压不是0,开始有mV级的跳动,心想这个不正常。又测试了一下恒流功能,已经不能正常工作了。

mainbanp 4653

写一个地道的django model

做web开发,编码往往以建模开始,下面以django1.5为标准,扯扯写一个地道的django model.(django1.4绝大部分可以兼容) 1.首先要对Field Options有个基本的认识(属性是面向model类而言的,字段是面向数据库而言的)     model由属性field组成,不同field类型,有不同的options,先了解所有field都公共的options。

secretx的专栏 4145

K210学习笔记(八)——人脸检测和人脸识别

前言 人脸检测是人脸识别算法的第一步,人脸识别过程主要分为人脸图像获取、人脸检测、人脸配准、人脸表征以及人脸图像匹配与识别。人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形(椭圆)在图像中的坐标,可能还包括姿态如倾斜角度等信息。人脸检测在安防监控,人证比对,人机交互,社交和娱乐等方面有很强的应用价值。 人脸识别是在人脸检测的基础上除了检测到人脸的位置以外, 还可以识别到这个人是谁,利用分析比较是基于人的脸视觉部特征信息进行身份鉴识别的计算机一种生物识别技术。 一、KPU模块方法 1、

Thousand_drive的博客 1万+

django的models使用介绍。

Django 提供了丰富的查询集方法,用于从数据库中检索数据。,可以使用它来访问查询集方法。你可以自定义管理器以添加自定义查询方法。模型类可以定义方法来实现特定的功能。模型字段是定义模型属性的方式。每个模型都有一个默认的管理器。

ededabo的博客 950

【嵌入式Linux】EC20模块多运营商自适应PPP拨号实战:从IMSI识别到网络配置

本文详细介绍了在嵌入式Linux系统中,如何基于EC20 4G模块实现多运营商自适应PPP拨号。通过解析SIM卡的IMSI识别运营商,并动态配置对应的APN和拨号参数,结合AT指令交互与健壮的pppd脚本,解决了设备跨地域部署时的网络自动连接问题,提升了物联网设备的部署效率和稳定性。

fox11的博客 904

Megatron-LM深度解析:万亿参数大模型的3D并行训练之道

训练框架,采用创新的"层内模型并行"设计,通过将Transformer层的计算拆分到多个GPU上并行执行,显著提升训练效率。该系统支持3D并行策略(数据并行、张量并行、流水线并行)和序列并行等新技术,成功应用于训练5300亿参数的MT-NLG模型。相比DeepSpeed、TPU GSPMD等框架,Megatron-LM在NVIDIA GPU上展现出卓越性能,并与TensorRT等工具深度集成,形成从训练到部署的完整解决方案。该项目持续演进,已成为大模型训练的重要基准。

数据与算法架构提升之路专栏 2091

django Model层常用验证器及自定义验证器

在Django中,对数据进行校验有两种方式:一种是通过Form校验,一种是通过Model校验。在此,我对Model中的校验方法做下记录。 示例之前补充以下几点: 1、Django数据校验方式分为以下三步: Model.clean_fields() 验证字段基本规则比如长度格式等; Model.clean() 可自定义验证条件和报错信息;...

bocai_xiaodaidai的博客 5493

Python 驱动 CAD 二次开发:从零搭建自动化绘图环境

本文详细介绍了如何利用Python进行CAD二次开发,实现自动化绘图。通过win32com库建立Python与CAD软件的通信,文章从环境搭建、连接CAD、操作文档到核心绘图与批量处理,提供了完整的实战指南。该方法能显著提升机械设计、建筑绘图等领域的重复性工作效率,将创造力从繁琐劳动中解放出来。

weixin_29093169的博客 1232

gte、lte、gt、lt 缩写的含义

gte、lte、gt、lt 缩写的含义 好记性不如一个烂笔杆,还是记下来吧。 gt:大于(greater than) gte:大于等于(greater than or equal) lt::小于(less than) lte:小于等于(less than or equal) eq:等于(equal) neq:不等于 ...

Aurora.Q 的博客 3万+

AI编程实战:用Spec Coding与Codex半小时重构全栈项目

这次我们来看一个能显著提升全栈开发效率的实战方法:利用 AI 编程工具 Codex 和 Spec Coding 工作流,将原本需要数周甚至一个月的全栈项目重构工期,压缩到半小时级别。这不是概念探讨,而是基于现有工具链的、可立即上手的工程实践。 对于前端开发者或全栈工程师而言,面对老旧项目重构、技术栈升级或从零搭建新项目时,最大的痛点往往是重复性、模式化的代码编写工作。手动编写 CRUD 接口、页面组件、状态管理和联调测试,耗时费力且容易出错。而 AI 辅助编程的核心价值,正是在于将开发者从这些“体力活”中解

weixin_33525298的博客 290

Arcgis加载在线地图(内涵各种在线地图)

这三个在线地图是最常用的在线地图,其他几个类型的在线地图请自行查看。,加载出在线图层说明连接成功,点击。1、首先打开Arcgis,找到。

爱吃雪糕的小布丁的博客 1万+

Django中models文件中的字段

Django 通过 models 实现数据库的创建、修改、删除等操作,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长。你通常不需要直接使用这个字段;如果你不指定主键的话,系统会自动添加一个主键字段到你的model。 BooleanField:布尔字段,管理工具里会自动将其描述为checkbox。 CharField:字符串字段,单行输入,用于较短的字符串,如要保

Allen_by的博客 2496

数字电路与逻辑设计实验二 组合逻辑电路

1.组合逻辑电路功能测试 (1)用 2 片 74LS00 组成图 2.1 所示逻辑电路。为便于接线和检查,在图中要注明 芯片编号及各引脚对应的编号。 (2)图中 A、B、C 接逻辑开关,Y1,Y2 接发光管电平显示。 (3)按表 2.3 要求,改变 A、B、C 输入的状态,填表并写出 Y1,Y2 的逻辑表达式。 (4)将运算结果与实验结果进行比较。 2.测试用异或门(74LS86)和与非门组成的半加器的逻辑功能。 根据半加器的逻辑表达式可知,半加 器 Y 是 A、B 的异或,而进位 Z 是 A

欢迎交流学习心得 1279

Django的Models字段含义

在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field options(所有字段共用)   1 null 默认为False,True则表示可以为null。(空字符串在数据库中可能被存储为'')   2 blank 默认为False,True表示可以为空。   3 choice 可选的...

weixin_30607029的博客 233

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

models 模型字段

常用字段类型 django所有的数据模型都继承自models.Model CharField max_length (输入框) TextField 没有长度限制的字符串 (文本域) DateField 日期 DateTimeField 日期+时间 BooleanField 真假 NullBooleanField Null,真假, Integer 整数 PositiveIntegerFie...

Chujianlong321的博客 886

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

自定义路由、django的models常用字段

{trailing_slash} —— “/” 或空字符串,取决于 trailing_slash 参数。{trailing_slash} —— “/” 或空字符串,取决于 trailing_slash 参数。{url_name} —— 提供给 @action 的 url_name。{url_name} —— 提供给 @action 的 url_name。{basename} —— 用于创建的 URL 名称的基础。{basename} —— 用于创建的 URL 名称的基础。

m0_68791463的博客 368

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

mysql创建时间默认当前时间_python测试开发django20.添加创建时间DateTimeField

前言我们在admin后台发布一篇文章的时候,一般会有创建时间和最后更新时间这2个字段,创建时间就是第一次编辑文章的时候自动添加的,最后更新时间就是每次修改文章的内容后自动更新在models.py建表的时候,设置creat_time和update_time类型为DateTimeField,添加auto_now_add和auto_now参数DateTimeField创建django的mode...

weixin_39791653的博客 469

全面了解Django的auth.User模型

本文介绍了Django中用户认证系统的核心机制。User类定义在django.contrib.auth.models中,对应数据库auth_user表存储用户核心信息。外键引用用户模型时应使用settings.AUTH_USER_MODEL实现灵活配置。重点解析了request.user的工作原理:通过中间件机制实现懒加载,首次访问时才会触发数据库查询,从session获取用户ID后查询auth_user表,并将结果缓存以提高性能。整个流程涉及SessionMiddleware和Authentication

lixufeng1028的博客 348

Django 中模型models字段类型总结

下边字段类型是在django中使用ORM创建数据模型时,常用的字段类型总结: 1、AutoField 一个自增的IntegerField,一般不直接使用,因为django会自动为每一张表添加自增primary_key 2、BigIntegerField 64位整数,-9223372036854775808 到 9223372036854775807 ...

记录点滴 5097

Django 中 models 用法及参数详解

Django 中 models 用法及参数详解

m0_63969219的博客 4616

【新手打怪指南】python Django models字段类型和字段参数

作用说明:默认生成列名为 id 的列,并设置为主键数据类型:int(11)必备参数:primary_key = True 作为主键存在主键django会默认自带。

PianoboyRichardX的博客 1699

django models的字段

连接: https://docs.djangoproject.com/en/2.2/ref/models/fields/ 1.Model field reference(模型字段引用) .本文档是Django提供了包含所有字段参考:包含字段操作和字段类型。 如果内置字段不管用,可以尝试django-localflavor( https://github.com/django/d...

Cat的博客 1518

django的models常用字段、属性

一丧:如果我的孤独是鱼,想必连鲸鱼都会慑于其巨大与狰狞而逃之夭夭。 django 模型models 常用字段 1、models.AutoField   自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一个自增列,必须设置primary_key=True。 2、models.CharField...

dreamingcrazy的博客 1569

【django】——models模型定义与字段

一、ORM简介 如今几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的,而对象的信息保存在关系数据库中。按照原始SQL方式开发,程序员会在自己的业务逻辑代码中编写很多sql语句用来CRUD相关数据库数据,而这些代码通常都是极其相似或者重复。 ORM对象关系映射(object elational Mapping,简称ORM)模式是一种为了解决面向对象与...

Wonder ZH 1560

django models 模型 从入门到进阶

Model 进阶学习 简介 Django经常被用于一些创业团队,乃是因为其非常适合敏捷开发,开发效率非常之高。Model作为Django重要组成部分也是亮点之一,着实需要我们花时间好好梳理一遍。 ORM需要好好学习一下,运用得当可以大大的提升代码的简洁性。Django的model模块,遵循了DRY(don’t repeat yourself)原则,也会使得代码更加容易维护,只需修改一次,肯...

python小菜鸡的博客 2万+

django models 之字段详解

     数据库模型是django操作数据库的主要途径,也是django和数据库连接的主要方法,几乎所有对数据库的操作都是通过models来完成的,下面我们就简单介绍一下创建模型时会涉及到的字段类型,以及字段设置的含义 Django models 的字段类型 1、models.AutoField   ---自增列 = int(11)    如果没有的话,默认会生成一个名称为 id 的列,如果要...

学习python 1万+
上一篇: django、sqlalchemy、mysql字符集charset的设置
下一篇: Django中间件Middleware
AggressionStorm
博客等级 码龄9年 6粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值