Django中Model的利用方法教程,djangomodel分分快三计

作者:编程技术

重写方法

Django中Model的选用方式教程,djangomodel

前言

正文首要给大家介绍了有关Django中Model使用的连锁内容,分享出来供我们参谋学习,上面话相当少说了,来一齐走访详细的介绍吧。

始建立模型型

运用Django的模型首要注意八个地点:字段的花色和办法的重写。这里用一个例证来验证,当中蕴藏了常用的字段类型和怎么着重写方法。

from django.db import models
class School(models.Model):
 pass
class Message(models.Model):
 pass
class Teacher(models.Model):
 pass
 class Student(models.Model):
 GENDER_CHOICES = (
  ('male', "男"),
  ('female', "女"),
  ('secret', "保密")
 )

 name = models.CharField(max_length=40, blank=True, verbose_name="姓名")
 gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default="secret", verbose_name="性别")
 age = models.IntegerField(default=0, verbose_name="年龄")
 rank = models.PositiveIntegerField(default=1, verbose_name="排名", unique=True)
 discount = models.DecimalField(max_digits=3, decimal_places=2, verbose_name="折扣", default=1.0)
 school = models.ForeignKey(to=School, verbose_name="学校", on_delete=models.CASCADE)
 message = models.OneToOneField(to=Message, verbose_name="信息", on_delete=models.CASCADE)
 teacher = models.ManyToManyField(verbose_name="老师", to=Teacher, blank=True)
 introduce = models.TextField(blank=True, verbose_name="介绍")
 grade = models.FloatField(default=0.0, verbose_name="成绩")
 url = models.URLField(verbose_name="个人主页", max_length=100)
 email = models.EmailField(verbose_name="邮箱")
 image = models.ImageField(upload_to='img/%Y/%m/%d/', verbose_name='上传图片', null=True)
 file = models.FileField(upload_to="file/%Y/%m/%d/", verbose_name="上传文件", blank=True)
 is_deleted = models.BooleanField(verbose_name="已删除", default=False, blank=True)
 time_added = models.DateTimeField(verbose_name="添加时间", auto_now_add=True, blank=True)
 def delete(self, using=None, keep_parents=False):
  self.is_deleted = True
  # some actions
  self.save()
 def save(self, force_insert=False, force_update=False, using=None,
    update_fields=None):
  # some actions
  self.name = self.name.capitalize() # 首字母大写
  return super().save(force_insert=force_insert, force_update=force_update, using=using,
       update_fields=update_fields)
 def __repr__(self):
  return "UserProfile:{}".format(self.name)
 def __str__(self):
  return self.name
 class Meta:
  ordering = ['-time_added']
  verbose_name = "用户信息"
  verbose_name_plural = verbose_name
  db_table = "student_info"

字段类型

这里对司空眼惯字段中值得注意的地点作一下证实。

CharField

字符串类型值得注意的是当该字段只好在是一些钦赐的值时,要利用choices参数来针对预先设定的值。

IntergerField & PositiveIntegerField

板寸门类和正整数类型。

DecimalField

十进制浮点数,在那之中,参数max_digits代表数字有稍稍位,decimal_places代表小数部分有稍许位。

ForeignKey

动用to指向被波及的模子,使用on_delete来显然被波及对象删除时该对象的管理格局。主要有两种取值,models.CASCADE和models.SET_NULL。models.CASCADE表示当被波及对象删除时去除该指标,models.SET_NULL表示当被波及对象被去除时将该目的设置为空,此设置的前提是该字段要允许为空。

ImageField & FileField

使用upload_to参数来钦赐文件保留的不二等秘书籍。注意,该路径前边再添加MEDIA_ROOT中设置的门路就是上传的文件真实保存路线了,如 MEDIA_ROOT的不二等秘书籍是'/home/media',那图片上传的路子就恍如/home/media/img/2018/03/06。

BooleanField

布尔类型,能够接纳default钦定私下认可值。

DateTimeField

在Django中,代表时间字段的有三种:Date提姆eField、DateField、TimeField,三连串型分别对应datetime()、date()、time(),都有auto_now和auto_now_add参数。

  • auto_now
    暗中同意值为False,设置为True时会在历次改善该目的时自动更新为当前时间,不过无法手动校勘该字段的值。
  • auto_now_add
    暗中认可值为False,设置为True时会在创立对象时自动安装为最近时间,之后都不再订正,也不可能手动改良其值。
  • 默许当前时光,又能改革
    偶然大家须求在成立对象时设置字段的值为近期几日子,在持续时又能改改,使用auto_now或者auto_now_add都无法完成这点。这时候,可以应用default参数来设置暗中认可值,如下
from django.db import models
from django.utils import timezone
class Message(models.Model):
add_date = models.DateTimeField(verbose_name='保存日期',default = timezone.now)
mod_date = models.DateTimeField(verbose_name='最后修改日期', auto_now = True)

重写方法

delete

Django暗中认可的去除是将数据从数据Curry删除,临时候大家要求软删除,保存在此之前的多少,那时我们可以利用三个布尔类型的字段标记该条数据是还是不是删除,这时候急需重写delete方法完结软删除。

在delete方法少将is_deleted的值设置为True,表示该条数据已去除。别的还足以实践一些关联的动作,比方对相关字段赋值等,最后保存对象。

save

重写save方法能够让我们在保存数据时做一些皮之不存毛将焉附的操作,比如保留姓名时自动安装为首字母大写,推行完之后须要调用父类的save方法开展封存。

repr & str

多头的效果是将变量或然常量调换为字符串对象,这里重写该方式使得对象实例能被转正为字符串。

class Meta

  • ordering:结果集依照何种方法排序,上边例子表示按加多时间的逆序排序
  • verbose_name:对象的名称
  • verbose_name_plural:对象复数情势的名号
  • db_table:在数据库中的表名

常用方法

在对常用方法介绍部分,由于地方的模子富含字段相当多,所以不使用方面成立的模型。这里运用一些广阔的模子,通过名字就能够知道代表的从头到尾的经过,因而就不列出模型了。

成立实例

create

动用create方法能够创立二个模子实例,将各字段在参数中安装各样字段的值。

student = Student.objects.create(name='zhangsan', gender='male')

get_or_create

get_or_create的效应是询问五个实例,当实例不设不时则开创八个实例。

obj, created = Person.objects.get_or_create(
 first_name='John',
 last_name='Lennon',
 defaults={'birthday': date(1940, 10, 9)},
)

函数再次来到贰个(object, created)的tuple,object是查询或然创造的靶子实例,created是个布尔类型的值,表示是还是不是是新创造的实例。在查询时接纳defaults以外的参数实行询问,当实例不设不常将含有default参数一齐创办多少个新的实例。效用相通于如下代码:

try:
 obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
 obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
 obj.save()

update_or_create

update_or_create的效应是改进五个实例,当实力官样文章时则开创二个实例。

obj, created = Person.objects.update_or_create(
 first_name='John', last_name='Lennon',
 defaults={'first_name': 'Bob'},
)

函数重临叁个(object, created)的tuple,object是翻新也许创制的指标实例,created是个布尔类型的值,表示是还是不是是新创造的实例。在查询的对象实例存在时,使用default中的参数进行翻新,当实例子虚乌有时,创立新的靶子实例,要求立异的字段的值设置为default中的值。功效附近:

defaults = {'first_name': 'Bob'}
try:
 obj = Person.objects.get(first_name='John', last_name='Lennon')
 for key, value in defaults.items():
  setattr(obj, key, value)
 obj.save()
except Person.DoesNotExist:
 new_values = {'first_name': 'John', 'last_name': 'Lennon'}
 new_values.update(defaults)
 obj = Person(**new_values)
 obj.save()

add

那边补充一下add方法,add用在多对多的关联模型上,表示增多该字段的针对性对象。

>>> john = Author.objects.create(name="John")
>>> paul = Author.objects.create(name="Paul")
>>> george = Author.objects.create(name="George")
>>> ringo = Author.objects.create(name="Ringo")
>>> entry.authors.add(john, paul, george, ringo)

下边的Author表示笔者模型,entry代表书籍条目款项,一本书能够有四个作者,接受多对多涉及。add可感觉书的实例增多多少个作者。

查询

all

all方法查询该对象的富有实例。

all_entries = Entry.objects.all()

get

接受get查询实例,当实例空头支票时会再次来到一个空头支票十三分。

>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")

filter

filter再次回到三个QuerySet,而不是目的实例,当查问结果子虚乌有时重返空的QuerySet,并不是回去一场,能够对结果集作切丝操作来获得实例内容。上面代码功效在有对象实例时生机勃勃致下面get的操作。

>>> entry = Entry.objects.filter(pk=1)[0]
>>> cheese_blog = Blog.objects.filter(name="Cheddar Talk")[0]

filter结果能够链式地开展操作,相当于背后能够接八个过滤条件。

Entry.objects.filter(pub_date__year=2006)
Entry.objects.all().filter(pub_date__year=2006)
Entry.objects.filter(blog__name__year="zhangsan")

上面的pub_date__year代表抽出DateField类型的pub_date的年,相仿的能够抽取月__month,日__day。在利用外键ForeignKey时可以采取双下划线来代表被提到对象的字段。

现行反革命来看一下链式过滤的例子。

Entry.objects.filter(
...  headline__startswith='What'
... ).exclude(
...  pub_date__gte=datetime.date.today()
... ).filter(
...  pub_date__gte=datetime.date(2005, 1, 30)
... )

首先使用__startswith过滤标题以'What'起头的数额。然后保留让公布日期小现今日的多少,exclude代表免除准则内的那部分数量,条件使用了__gte表示大于当前不久期,该有的过滤相似于filter后边使用__lte小于。最后也是行使__gte大于一个自定义的日子。

除此之外下面的过滤条件外,绳床瓦灶的还恐怕有__icontains,表示满含该内容。

Q

Q是Django自带的内容,用于查询。首要的用处是在页面的探究框中输入内容后台查询相应的多少集。

student = student.filter(Q(name__icontains=search) |
       Q(teacher__name__icontains=search) |
       Q(gender__icontains=search) |
       Q(url__icontains=search))

上述例子常用在二个寻觅框可能搜索八个字段的剧情时,各种过滤条件之间利用“|”进行只怕运算。当多规格查询时,各种条件是并运算,使用“&”代替“|”。

Q能够复制给个变量,不经常候我们须求对Q前边的剧情先做一些管理,如将日期拼凑出来等,那时能够先把Q赋值给贰个变量,然后对变量举行“|”或许“&”操作。

query = Q(name__icontains=search)
query = query | Q(teacher__name__icontains=search)
student = student.filter(query)

总结

以上便是那篇小说的全体内容了,希望本文的剧情对大家的求学只怕办事有所自然的参照他事他说加以考查学习价值,假如有问号咱们能够留言沟通,多谢大家对帮客之家的扶持。

前言 本文首要给大家介绍了有关Django中Model使用的有关内容,共享出来供我们参谋学习,下边话非常少...

get_or_create

get_or_create的成效是询问一个实例,当实例不设不经常则成立叁个实例。

obj, created = Person.objects.get_or_create(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

函数再次来到四个(object, created)的tuple,object是查询只怕创建的目的实例,created是个布尔类型的值,表示是不是是新创设的实例。在查询时接收defaults以外的参数举行询问,当实例不设一时将含有default参数一齐创办二个新的实例。成效看似于如下代码:

try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
    obj.save()

IntergerField & PositiveIntegerField

卡尺头品种和正整数类型。

delete

Django暗许的去除是将数据从数据Curry删除,临时候我们须要软删除,保存早前的数据,此时我们能够行使贰个布尔类型的字段标志该条数据是或不是删除,那时候要求重写delete方法完成软删除。
在delete方法中将is_deleted的值设置为True,表示该条数据已删除。其余还是能实行一些关系的动作,比方对有关字段赋值等,最终保存对象。

all

all方法查询该目的的具备实例。

all_entries = Entry.objects.all()

查询

ImageField & FileField

使用upload_to参数来钦命文件保留的门路。注意,该路线前边再加上 MEDIA_ROOT中装置的门径便是上传的公文真实保存路线了,如 MEDIA_ROOT的不二秘籍是'/home/media',那图片上传的渠道就恍如/home/media/img/2018/03/06。

add

那边补充一下add方法,add用在多对多的关联模型上,表示增添该字段的对准对象。

>>> john = Author.objects.create(name="John")
>>> paul = Author.objects.create(name="Paul")
>>> george = Author.objects.create(name="George")
>>> ringo = Author.objects.create(name="Ringo")
>>> entry.authors.add(john, paul, george, ringo)

地点的Author表示小编模型,entry表示书籍条款,一本书能够有八个小编,采纳多对多关系。add可认为书的实例增多多少个笔者。

get

接纳get查询实例,当实例子虚乌有时会再次来到二个不设有特别。

>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")

Q

Q是Django自带的内容,用于查询。主要的用处是在页面包车型客车探索框中输入内容后台查询相应的数量集。

from django.db.models import Q

student = student.filter(Q(name__icontains=search) |
                         Q(teacher__name__icontains=search) |
                         Q(gender__icontains=search) |
                         Q(url__icontains=search) |
                         Q(id__in=lid_lists))

上述例子常用在一个寻找框恐怕搜索四个字段的从头到尾的经过时,各样过滤条件之间利用“|”进行或许运算。当多规格查询时,各类条件是并运算,使用“&”取代“|”。
Q能够复制给个变量,不经常候大家需求对Q前边的源委先做一些管理,如将日期拼凑出来等,此时能够先把Q赋值给二个变量,然后对变量进行“|”只怕“&”操作。

query = Q(name__icontains=search)
query = query | Q(teacher__name__icontains=search)
student = student.filter(query)

ForeignKey

利用to指向被提到的模子,使用on_delete来规定被波及对象删除时该目标的管理格局。主要有三种取值,models.CASCADE和models.SET_NULL。models.CASCADE表示当被波及对象删除时去除该目的,models.SET_NULL表示当被波及对象被删去时将该目的设置为空,此设置的前提是该字段要允许为空。

急需注意的是,不时候须要完结自关系,比如单位的上司依然单位,这时使用self表示自个儿模型:

class Department(models.Model):  

    ''''' 
    some other filed 
    '''  
    super_department = models.ForeignKey('self')  

repr & str

两侧的功效是将变量大概常量调换为字符串对象,这里重写该情势使得对象实例能被转载为字符串。

DecimalField

十进制浮点数,个中,参数max_digits代表数字有个别许位,decimal_places代表小数部分有稍许位。

create

接受create方法能够创造二个模型实例,将各字段在参数中装置各种字段的值。

student = Student.objects.create(name='zhangsan', gender='male')

BooleanField

布尔类型,能够运用default钦点私下认可值。

外键列表

students = Students.objects.all()
# 外键school的id列表
school_ids = students.values_list("school", flat=True)
# school列表
schools = School.objects.filter(id__in=school_ids)

当要使获取的列表去重时,使用distinct

school_ids = students.values_list("school", flat=True).distinct()

values()和values_list()区别:

students.values_list("school_id", flat=True).distinct()
# 获取一个list  [1, 2]
# 如果不加 flat=True, 返回一个tuple的list [(1,), (2,)]
students.values("school_id").distinct()
# 返回一个dict的list 
# [{'school_id': 1}, {'school_id': 2}]

CharField

字符串类型值得注意的是当该字段只可以在是一些钦定的值时,要利用choices参数来针对预先设定的值,假设要在templates中展现表达使用{{ get_gender_display }}。

创立模型

行使Django的模子主要注意七个地点:字段的花色和艺术的重写。这里用贰个例证来表明,当中蕴藏了常用的字段类型和怎么重写方法。

from django.db import models


class School(models.Model):
    pass


class Message(models.Model):
    pass


class Teacher(models.Model):
    pass


class Student(models.Model):

    GENDER_CHOICES = (
        ('male', "男"),
        ('female', "女"),
        ('secret', "保密")
    )

    name = models.CharField(max_length=40, blank=True, verbose_name="姓名")
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default="secret", verbose_name="性别")
    age = models.IntegerField(default=0, verbose_name="年龄")
    rank = models.PositiveIntegerField(default=1, verbose_name="排名", unique=True)
    discount = models.DecimalField(max_digits=3, decimal_places=2, verbose_name="折扣", default=1.0)
    school = models.ForeignKey(to=School, verbose_name="学校", on_delete=models.CASCADE)
    message = models.OneToOneField(to=Message, verbose_name="信息", on_delete=models.CASCADE)
    teacher = models.ManyToManyField(verbose_name="老师", to=Teacher, blank=True)
    introduce = models.TextField(blank=True, verbose_name="介绍")
    grade = models.FloatField(default=0.0, verbose_name="成绩")
    url = models.URLField(verbose_name="个人主页", max_length=100)
    email = models.EmailField(verbose_name="邮箱")
    image = models.ImageField(upload_to='img/%Y/%m/%d/', verbose_name='上传图片', null=True)
    file = models.FileField(upload_to="file/%Y/%m/%d/", verbose_name="上传文件", blank=True)
    is_deleted = models.BooleanField(verbose_name="已删除", default=False, blank=True)
    time_added = models.DateTimeField(verbose_name="添加时间", auto_now_add=True, blank=True)

    def delete(self, using=None, keep_parents=False):
        self.is_deleted = True
        # some actions
        self.save()

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        # some actions
        self.name = self.name.capitalize()  # 首字母大写
        return super().save(force_insert=force_insert, force_update=force_update, using=using,
                            update_fields=update_fields)

    def __repr__(self):
        return "UserProfile:{}".format(self.name)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['-time_added']
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name
        db_table = "student_info"
        unique_together = ("name", "gender")

字段类型

这里对何奇之有字段中值得注意的地点作一下证实。

DateTimeField

在Django中,代表时间字段的有两种:DateTime菲尔德、Date菲尔德、提姆eField,三类别型分别对应datetime()、date()、time(),都有auto_now和auto_now_add参数。

  • auto_now
    私下认可值为False,设置为True时会在历次改良该对象时自动更新为近年来时光,可是不可能手动改良该字段的值。
  • auto_now_add
    私下认可值为False,设置为True时会在创立对象时自动安装为近来时光,之后都不再修改,也无法手动改过其值。
  • 默许当前时刻,又能校订
    不时候大家要求在创设对象时设置字段的值为日前时间,在继续时又能校正,使用auto_now或者auto_now_add都无可奈何完结那点。那时候,能够利用default参数来设置暗中同意值,如下
from django.db import models
from django.utils import timezone
class Message(models.Model):
    add_date = models.DateTimeField(verbose_name='保存日期',default = timezone.now)
    mod_date = models.DateTimeField(verbose_name='最后修改日期', auto_now = True)

save

重写save方法可以让大家在保留数据时做一些相关的操作,举个例子保留姓名时自动安装为首字母大写,执行完以往须要调用父类的save方法实行封存。

常用方法

在对常用方法介绍部分,由于地方的模型包涵字段相当多,所以不选拔方面创造的模型。这里运用部分大面积的模型,通过名字就足以知道代表的始末,由此就不列出模型了。

始建实例

filter

filter重返二个QuerySet,而不是目的实例,当查问结果荒诞不经时重临空的QuerySet,并非回去万分,能够对结果集作切条操作来博取实例内容。下边代码功效在有对象实例时风流倜傥致上面get的操作。

>>> entry = Entry.objects.filter(pk=1)[0]
>>> cheese_blog = Blog.objects.filter(name="Cheddar Talk")[0]

filter结果能够链式地开展操作,也正是背后能够接多少个过滤条件。

import datetime
time = datetime.datetime.now()
Entry.objects.filter(status=type).exclude(time_start__gte=time)

Entry.objects.filter(pub_date__year=2006)
Entry.objects.all().filter(pub_date__year=2006)

上面的pub_date__year代表抽取DateField类型的pub_date的年,形似的可以收取月__month,日__day。在动用外键ForeignKey时得以接受双下划线来代表被波及对象的字段。
这段时间来看一下链式过滤的例证。

Entry.objects.filter(
...     headline__startswith='What'
... ).exclude(
...     pub_date__gte=datetime.date.today()
... ).filter(
...     pub_date__gte=datetime.date(2005, 1, 30)
... )

率先应用__startswith过滤标题以'What'初阶的数码。然后保留让发表日期小于明日的数额,exclude表示免除法规内的那部分数目,条件使用了__gte表示大于当前几天期,该片段过滤相近于filter后边使用__lte小于。最终也是行使__gte大于一个自定义的日期。
除了这几个之外上边列举的一些查询条件外还会有众多常用的:

__exact         精确等于
__iexact        精确等于 忽略大小写
__contains      包含
__icontains     包含 忽略大小写
__gt            大于
__gte           大于等于
__lt            小于
__lte           小于等于
__in            存在于一个list范围内
__startswith    以...开头
__istartswith   以...开头 忽略大小写
__endswith      以...结尾
__iendswith     以...结尾 忽略大小写
__range         在...范围内
__year          日期字段的年份
__month         日期字段的月份
__day           日期字段的日
__isnull=True/False 

update_or_create

update_or_create的效应是翻新一个实例,当实力不真实时则制造多少个实例。

obj, created = Person.objects.update_or_create(
    first_name='John', last_name='Lennon',
    defaults={'first_name': 'Bob'},
)

函数重临多个(object, created)的tuple,object是修改只怕制造的指标实例,created是个布尔类型的值,表示是还是不是是新创制的实例。在询问的对象实例存在时,使用default中的参数举行翻新,当实例不设一时,创制新的靶子实例,须求更改的字段的值设置为default中的值。功用相像:

defaults = {'first_name': 'Bob'}
try:
    obj = Person.objects.get(first_name='John', last_name='Lennon')
    for key, value in defaults.items():
        setattr(obj, key, value)
    obj.save()
except Person.DoesNotExist:
    new_values = {'first_name': 'John', 'last_name': 'Lennon'}
    new_values.update(defaults)
    obj = Person(**new_values)
    obj.save()

反向查找

反向查找首假诺用在外键的图景下,通过被提到对象查找关联对象。

# post文章,comment评论
comment_list = post.comment_set.all()   # 获取文章的所有评论
post.comment_set.count      # 文章的所有评论数

除开上边的用法,还足以选择related_name来进行反向寻找,何况当三个模子中有多少个字段关联同叁个模型时,在外键中自然要用related_name。

class School(models.Model):
    name = models.CharField()
class Student(models.Model):
    school = models.ForeignKey(School, related_name='SS')
    code = models.CharField()

这么能够遵照Student来查School:

School.objects.filter(SS_code="123456")

也足以因而School的实例查找全部以该实例为外键的Student:

school.SS.all()

class Meta

  • ordering:结果集依照何种方法排序,上边例子表示按增多时间的逆序排序
  • verbose_name:对象的名称
  • verbose_name_plural:对象复数格局的称号
  • db_table:在数据库中的表名
  • unique_together: 联合唯风流洒脱

本文由分分快三计划发布,转载请注明来源

关键词: 分分快三计划