• Django 模型层


    基本操作

    1、meta类属性汇总

    属性名 用法 举例代码
    abstract
    如果设置abstract=True则这个模式是一个抽象基类  
    db_table
    定义model在数据库中的表名称,如果不定义,会生成默认’应用名_模型名‘
    db_table = 'music_album'
    get_latest_by
    用于指定默认的排序字段,支持DateFieldDateTimeFieldIntegerField
    get_latest_by =“ORDER_DATE”
    managed
    True或False,定义django命令行migrate工具是否管理此模型  
    order_with_respect_to
    根据给定的字段对 model 排序。在关联关系中,它经常用在根据目标对象对源对象排序的场合。举 个例子,一个 Answer 只关联一个 Question 对象,而一个 question 对象却可以关联多 个 answer 对象。根据 question 对 answer 排序,
    order_with_respect_to = 'question'
    ordering
    定义默认的排序列,如果在字段前加"-"表示降序排列,不加则是升序排列。加?随机排列
    ordering = ['-pub_date', 'author']
    permissions
    在创建对象时,添加到权限表当中的附加权限信息。Django 自动为每个设置了 admin 的对象创建了添 加,删除和修改的权限。
    permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)或

    (permission_code, human_readable_permission_name) 。
    default_permissions
    默认包含('add','change','delete')  
    proxy
    如果 proxy = True ,表示该 model 是其父类的代理  
    unique_together
    用来设置的不重复的字段组合,必须唯一(将两个字段做联合唯一):
    unique_together = (("driver", "restaurant"),)
    index_together
    通过字段名集合创建索引,会根据选项生成合适的CREATE INDEX语句
    index_together = ["pub_date", "deadline"]
    verbose_name
    指定该对象的一个可读性更好的唯一名字(单数):
    verbose_name = "pizza"
    verbose_name_plural
    指定该对象的一个可读性更好的唯一名字(复数):默认是verbose_name+"s"
    verbose_name_plural = "stories"

    字段名称限制:

    一个字段名不能包含连续的一个以上的下划线,因为那是Django查询语句的语法。

    2、字段列表纵览表

    字段名

    参数

    意义

    AutoField

    一个能够根据可用ID自增的 IntegerField

    BooleanField

    一个真/假(true/false)字段

    CharField

     (max_length)

    一个字符串字段,适用于中小长度的字符串。对于长段的文字,请使用 TextField

    CommaSeparatedIntegerField

     (max_length)

    一个用逗号分隔开的整数字段

    DateField

    ([auto_now], [auto_now_add])

    日期字段

    DateTimeField

    时间日期字段,接受跟 DateField 一样的额外选项

    EmailField

    一个能检查值是否是有效的电子邮件地址的 CharField

    FileField

    (upload_to)

    一个文件上传字段

    FilePathField

    (path,[match],[recursive])

    一个拥有若干可选项的字段,选项被限定为文件系统中某个目录下的文件名

    FloatField

    (max_digits,decimal_places)

    一个浮点数,对应Python中的 float 实例

    ImageField

    (upload_to, [height_field] ,[width_field])

    像 FileField 一样,只不过要验证上传的对象是一个有效的图片。

    IntegerField

    一个整数。

    IPAddressField

    一个IP地址,以字符串格式表示(例如: "24.124.1.30" )。

    NullBooleanField

    就像一个 BooleanField ,但它支持 None /Null 。

    PhoneNumberField

    它是一个 CharField ,并且会检查值是否是一个合法的美式电话格式

    PositiveIntegerField

    和 IntegerField 类似,但必须是正值。

    PositiveSmallIntegerField

    与 PositiveIntegerField 类似,但只允许小于一定值的值,最大值取决于数据库.

    SlugField

     嵌条 就是一段内容的简短标签,这段内容只能包含字母、数字、下

    划线或连字符。通常用于URL中

    SmallIntegerField

    和 IntegerField 类似,但是只允许在一个数据库相关的范围内的数值(通常是-32,768到

    +32,767)

    TextField

    一个不限长度的文字字段

    TimeField

    时分秒的时间显示。它接受的可指定参数与 DateField 和 DateTimeField 相同。

    URLField

    用来存储URL的字段。

    USStateField

    美国州名称缩写,两个字母。

    XMLField

    (schema_path)

    它就是一个 TextField ,只不过要检查值是匹配指定schema的合法XML。

    3、通用字段参数列表(所有的字段类型都可以使用下面的参数,所有的都是可选的。)

    参数名

    意义

    null

    如果设置为 True 的话,Django将在数据库中存储空值为 NULL 。默认为 False 。

    blank

    如果是 True ,该字段允许留空,默认为 False 。

    choices

    一个包含双元素元组的可迭代的对象,用于给字段提供选项。

    db_column

    当前字段在数据库中对应的列的名字。

    db_index

    如果为 True ,Django会在创建表格(比如运行 manage.py syncdb )时对这一列创建数据库索引。

    default

    字段的默认值

    editable

    如果为 False ,这个字段在管理界面或表单里将不能编辑。默认为 True 。

    help_text

    在管理界面表单对象里显示在字段下面的额外帮助文本。

    primary_key

    如果为 True ,这个字段就会成为模型的主键。

    radio_admin

    默认地,对于 ForeignKey 或者拥有 choices 设置的字段,Django管理界面会使用列表选择框(<select>)。如果 radio_admin 设置为 True 的话,Django就会使用单选按钮界面。

    unique

    如果是 True ,这个字段的值在整个表中必须是唯一的。

    unique_for_date

    把它的值设成一个 DataField 或者 DateTimeField 的字段的名称,可以确保字段在这个日期内不会出现重复值。

    unique_for_month

    和 unique_for_date 类似,只是要求字段在指定字段的月份内唯一。

    unique_for_year

    和 unique_for_date 及 unique_for_month 类似,只是时间范围变成了一年。

    verbose_name

    除 ForeignKey 、 ManyToManyField 和 OneToOneField 之外的字段都接受一个详细名称作为第一个位置参数。

    4、django字段查询谓词表

    django两种过滤器

    • filter:返回符合条件的数据集
    • exclude:返回不符合条件的数据集

    查询条件用:双下划线链接的字段名称和谓词来表达查询条件

    谓词 含义 实例 等价SQL语句
    exact 精确等于 Entry.objects.get(id__exact=14) SELECT ... WHERE id = 14
    iecact 大小写不敏感的等于 Entry.objects.get(headlin__exact='I like this') SELECT....WHERE upper(headline) = 'I LIKE THIS'
     contains 模糊匹配 Entry.objects.get(headline__contains='Lennon')
    SELECT ... WHERE headline LIKE '%Lennon%';
     in 在列表中查找 Entry.objects.filter(id__in=[1, 3, 4]) SELECT ... WHERE id IN (1, 3, 4);
    gt gte lt lte  比较大小等于 Entry.objects.filter(id__gt=4) SELECT ... WHERE id > 4;
    startswith 以...开始查找 Entry.objects.filter(headline__startswith='Will') SELECT ... WHERE headline LIKE 'Will%';
    endswith 以...结尾查找 Entry.objects.filter(headline__endswith='cats') SELECT ... WHERE headline LIKE '%cats';
    range 范围查找 start_date = datetime.date(2005, 1, 1)
    end_date = datetime.date(2005, 3, 31)
    Entry.objects.filter(pub_date__range=(start_date, end_date))
    SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
    year month  day 按年 月 日 查找 Entry.objects.filter(pub_date__year=2005)
    SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31 23:59:59.999999';
    week_day  按星期几查找 Entry.objects.filter(pub_date__week_day=2)  
     isnull 是否为空查找 Entry.objects.filter(pub_date__isnull=True) SELECT ... WHERE pub_date IS NULL;

    Django还提供了get()用于查询单条记录   comment.objects.get(id__exact = 1)

    Django还支持查询指定条数的数据集

     comment.objects.all()[:10]

     comment.objects.all()[10:20]

     comment.objects.all()[1]

    还支持order_by操作

    comment.objects.order_by('headline')

    5、数据保存与删除

    DJango定义了一个统一的save方法,完成模型的insert和update操作,执行save函数,自动判断记录是否存在,存在则更新,否则删除

    删除操作  comment.objects.get(id__exact = 1)。delete()

    6、关系操作

     一对一关系 OneToOneField

    from django.db import models
    
    class Account(models.Model):
        username = models.CharField(max_length=80)
        password = models.CharField(max_length=225)
        ref_date = models.DateField()
        
        def __unicode__(self):
            return 'Account: %s' % self.username
        
    class Contact(models.Model):
        account = models.OneToOneField(
            Account, # 被关联的模型名
            on_delete=models.CASCADE,# 当被关联模型记录被删除时,本记录也会被删除
            primary_key=True,
        )
        zip_code = models.CharField(max_length=10)
        address = models.CharField(max_length=80)
        mobile = models.CharField(max_length=20)
        
        def __unicode__(self): # 定义模型的显示字符串
            return '%s ,%s' % (self.account.username,self.mobile)

    一对多关系 ForeignKey

    from django.db import models
    
    class Account(models.Model):
        username = models.CharField(max_length=80)
        password = models.CharField(max_length=225)
        ref_date = models.DateField()
    
        def __unicode__(self):
            return 'Account: %s' % self.username
    
    class Contact(models.Model):
        account = models.ForeignKey(
            Account, # 被关联的模型名
            on_delete=models.CASCADE,# 当被关联模型记录被删除时,本记录也会被删除
        )
        zip_code = models.CharField(max_length=10)
        address = models.CharField(max_length=80)
        mobile = models.CharField(max_length=20)
    
        def __unicode__(self): # 定义模型的显示字符串
            return '%s ,%s' % (self.account.username,self.mobile)
    print(a.contact_set) # 从主对象中找到附对象
    
    [<Contact:Rose,13145671234>,<Contact:Rose,13178654234>]

    在一对多关系中,每个模型可以关联多个子对象,所以本例从主模型Account对象中寻找附模型Contact的属性时contact_set,通过一个集合返回关联结果

    注:xxx_set时Django设定的通过主模型对象访问附模型对象集合的属性名,相当于flask中的backref属性

    多对多关系 ManyToMany

    from django.db import models
    
    class Account(models.Model):
        username = models.CharField(max_length=80)
        password = models.CharField(max_length=225)
        ref_date = models.DateField()
    
        def __unicode__(self):
            return 'Account: %s' % self.username
    
    class Contact(models.Model):
        accounts = models.ManyToManyField(
            Account, # 被关联的模型名
        )
        zip_code = models.CharField(max_length=10)
        address = models.CharField(max_length=80)
        mobile = models.CharField(max_length=20)
    
        def __unicode__(self): # 定义模型的显示字符串
            return '%s ,%s' % (self.accounts.username,self.mobile)

    演示

    #分别建立和保存Account和Contact对象
    >>a1 = Account(user_name = 'Leon')
    >>a1.save()
    >>c1 = Contact(mobile = '13145671234')
    >>c1.save()
    
    >>c1.accounts.add(a1)   # 通过Contact对象建立关系
    
    >>a2= Account(user_name = 'Terry')
    >>a2.save()
    >>a2.contact_set.add(c1) # 通过Account对象建立关系
    
    >>a1.contact_set.remove(c1) # 取消单个对象关联
    >>a1.contact_set.clear() # 取消a1与所有其他Contact对象的关联

     7、面向对象ORM

    抽象类继承

    抽象类的作用是在多个表由若干相同的字段时,可以将这些字段统一定义在抽象基类中,免于重复定义这些字段,抽象基类通过模型的meta中定义abstract = True来实现

    from django.db import models
    
    # Create your models here.
    
    class MessageBase(models.Model):
        id = models.AutoField()
        username = models.CharField(max_length=80)
        content = models.CharField(max_length=225)
        pub_date = models.DateField()
        
        class Meta:
            abstract=True # 定义本类为抽象基类
    
    
    KIND_CHOICES = (
        ('python技术','python技术'),
        ('数据库技术','数据库技术'),
        ('经济学','经济学'),
        ('文体资讯','文体资讯'),
        ('个人心情','个人心情'),
        ('其他','其他'),
    )
    
    class Moment(MessageBase): #继承抽象类
        kind = models.CharField(max_length=20,choices=KIND_CHOICES,default=KIND_CHOICES[0])
    
    class Comment(MessageBase):
        headline = models.CharField(max_length=50)

    子类模型的编程中可以直接引用父类定义的字段,以上会生成2个表

    多表继承-无需特殊关键字

    from django.db import models
    
    # Create your models here.
    
    class MessageBase(models.Model):
        id = models.AutoField()
        username = models.CharField(max_length=80)
        content = models.CharField(max_length=225)
        pub_date = models.DateField()
    
    KIND_CHOICES = (
        ('python技术','python技术'),
        ('数据库技术','数据库技术'),
        ('经济学','经济学'),
        ('文体资讯','文体资讯'),
        ('个人心情','个人心情'),
        ('其他','其他'),
    )
    
    class Moment(MessageBase):
        kind = models.CharField(max_length=20,choices=KIND_CHOICES,default=KIND_CHOICES[0])
    
    class Comment(MessageBase):
        headline = models.CharField(max_length=50)

    以上会生成3个表,但是编程中,django内部自动实现父模型和子模型之间一对一关系来实现多表继承技术

    # 新建Comment对象,直接在子类中引用父类字段
    >>m1 = Comment(username = 'join',headline = 'hello')
    >>m1.content = 'hahahahah'
    >>m1.save()
    
    # 通过父类实例引用父类字段
    >> print(m1.messagebase.content)# 多表继承中通过小写的父类名字就可以引用父类实例
    hahahahah

    代理模型继承

    前两种继承模型中子类模型都有实际存储的作用,而代理模型继承中子类只用于管理父类数据,而不实际存储数据,代理模型继承需要通过子类的Meta中定义的proxy = True属性来实现

    from django.db import models
    
    class Moment(models.Model):
        id = models.AutoField()
        username = models.CharField(max_length=80)
        content = models.CharField(max_length=225)
        pub_date = models.DateField()
    
    class OrderdMoment(Moment):
        class Meta:
            proxy = True
            ordering =['-pub_date']

    使用代理继承的原因时:子类中新的特性不影响父类模型及其已有代码的行为

  • 相关阅读:
    思考未来--马云说:30年后的世界不属于互联网公司
    公司管理系列--Facebook是如何营造企业文化的[转]
    公司管理系列--摒弃“学生思维”,教你如何科学地步入互联网职场?[转]
    问题集录--如何本地调试微信接口(未测试)
    公司管理系列--80% of Your Culture is Your Founder(FaceBook)
    常用工具说明--Mockplus,简洁的原形图设计工具
    你应该知道的计算机网络知识
    【转】TCP那些事(上,下)
    【转】由浅入深探究mysql索引结构原理、性能分析与优化
    【转】程序员技术练级攻略
  • 原文地址:https://www.cnblogs.com/Erick-L/p/7094974.html
Copyright © 2020-2023  润新知