Djano模型层之模型字段选项,Django中Model的行使方式教程

开创模型

运用Django的模型主要注意四个方面:字段的品种和措施的重写。这里用2个例子来验证,个中富含了常用的字段类型和哪些重写方法。

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")

Django中Model的利用格局教程,djangomodel

前言

正文主要给我们介绍了关于Django中Model使用的相干内容,分享出去供我们参考学习,上边话不多说了,来三头探访详细的牵线吧。

始建立模型型

动用Django的模型重要注意八个地点:字段的品种和措施的重写。这里用1个例子来证实,个中饱含了常用的字段类型和怎么着重写方法。

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"

字段类型

Djano模型层之模型字段选项,Django中Model的行使方式教程。此地对常见字段中值得注意的地点作一下表达。

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/0陆。

BooleanField

布尔类型,能够应用default钦赐暗中认可值。

DateTimeField

在Django中,代表时间字段的有两种:DateTimeField、DateField、Time菲尔德,叁体系型分别对应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的机能是询问1个实例,当实例不存在时则开创多个实例。

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的法力是翻新3个实例,当实力不设有时则创建一个实例。

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

函数重临2个(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表示书籍条款,1本书能够有四个小编,选择多对多关系。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重临2个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)
... )

第1利用__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赋值给1个变量,然后对变量进行“|”恐怕“&”操作。

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

总结

上述便是这篇小说的全体内容了,希望本文的内容对我们的就学恐怕办事具有自然的参考学习价值,就算有疑点大家能够留言互换,感激大家对帮客之家的支撑。

前言
本文主要给大家介绍了有关Django中Model使用的相干内容,分享出来供大家参考学习,下边话不多…

前言

字段选项

字段类型

此地对常见字段中值得注意的地点作一下表明。

本文主要给大家介绍了有关Django中Model使用的有关内容,分享出来供大家参考学习,上面话不多说了,来壹块看看详细的介绍吧。

以下参数是全部字段类型都可用的,而且是可选的

CharField

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

创办模型

null

IntergerField & PositiveIntegerField

平头种类和正整数类型。

选拔Django的模子重要注意八个方面:字段的品类和章程的重写。这里用2个事例来证实,在那之中涵盖了常用的字段类型和如何重写方法。

假设为True,Django就要数据库中校空值存款和储蓄为NULL。暗许值为False

DecimalField

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

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"

对于字符串字段,假设设置了null=True意味着“无数据”有四个可能的值,NULL和空字符串,在大部气象下,大家在数据库中蕴藏无数据的字符串时,不会区分到底是NULL依然空字符串,假使存款和储蓄了多少个值势必会扩大操作数据的难度。django的老规矩是使用空字符串,所以大家在创制字符串字段(如:CharField、TextField)尽量不要设置null=True。null属性对于字符串字段也毫无未有用处,比如那种景况就不能够不安装null=True,如当CharField同时具有blank=True和unique=True属性是,在那种状态下,需求设置null=True,以便在数据库中运用NULL保存对个目的,从而落成唯壹性(NULL!=NULL)

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')  

字段类型

一经期待BooleanField接受null值,请使用NULLBollean菲尔德类来替代

ImageField & FileField

使用upload_to参数来钦命文件保留的门道。注意,该路径前边再拉长MEDIA_ROOT中安装的不二法门便是上传的公文真实保存路线了,如
MEDIA_ROOT的门路是’/home/media’,那图片上传的门路就就好像/home/media/img/2018/03/06。

此地对常见字段中值得注意的地点作一下表达。

留意:在应用Oracle数据库时,数据库使用NULL来表示空字符串,与null那些性格非亲非故

BooleanField

布尔类型,能够行使default钦赐私下认可值。

CharField

 blank

DateTimeField

在Django中,代表时间字段的有两种:DateTimeField、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)

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

假如为True,字段允许为空,暗许False

重写方法

IntergerField & PositiveIntegerField

与null差异,null纯粹是数据库范畴,blank是数据证实范畴,假诺blank=True,字段可为空,不然为必填字段

delete

Django私下认可的删减是将数据从数据Curry删除,有时候我们要求软删除,保存以前的多少,那时候我们能够运用一个布尔类型的字段标记该条数据是不是删除,那时需求重写delete方法实现软删除。
在delete方法大校is_deleted的值设置为True,表示该条数据已去除。此外还足以施行一些事关的动作,举例对相关字段赋值等,最终保存对象。

平头体系和正整数类型。

choices

save

重写save方法能够让我们在保留数据时做一些连锁的操作,举个例子保留姓名时自动安装为首字母大写,实践完今后供给调用父类的save方法开始展览封存。

DecimalField

它是1个可迭代的构造(如列表、元组),由可迭代的贰元元组表示,用来给字段提供选项

repr & str

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

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

每一个元组中的第三个因素,是积存在数据库中的值;第四个要素是使人轻巧驾驭的描述。
举个例子:

class Meta

  • ordering:结果集遵照何种格局排序,上边例子表示按加多时间的逆序排序
  • verbose_name:对象的称谓
  • verbose_name_plural:对象复数格局的名目
  • db_table:在数据库中的表名
  • unique_together: 联合唯一

ForeignKey

YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
)

常用方法

在对常用方法介绍部分,由于地点的模子包涵字段较多,所以不使用方面成立的模型。这里运用一些大面积的模子,通过名字就足以通晓代表的始末,因而就不列出模型了。

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

诚如的话,最佳给每一个值定义二个恰如其分名字的常量,然后再在模型类内部定义choices:

始建实例

ImageField & FileField

from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in (self.JUNIOR, self.SENIOR)

create

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

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

使用upload_to参数来钦命文件保留的路线。注意,该路径后边再增添MEDIA_ROOT中设置的路径就是上传的文书真实保存路线了,如
MEDIA_ROOT的路子是’/home/media’,那图片上传的路线就像/home/media/img/2018/03/0陆。

那般做的裨益是驱动choices更易于被引述,举例, Student.SOPHOMORE
能够在另外引进Student 模型的职位生效

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参数一同创立3个新的实例。功用周边于如下代码:

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()

BooleanField

您也能够归类choices:

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()

布尔类型,能够选取default钦点暗中认可值。

MEDIA_CHOICES = (
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
)

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表示书籍条款,1本书能够有多少个小编,选取多对多关系。add可以为书的实例加多多少个作者。

DateTimeField

对于有choices属性的模子字段, Django
使用get_FOO_display()办法来得到当前字段值的轻易掌握的名称

查询

在Django中,代表时间字段的有二种:DateTimeField、DateField、TimeField,三体系型分别对应datetime()、date()、time(),都有auto_now和auto_now_add参数。

瞩目:choices能够是别的可迭代的对象 ,
不是必须是列表恐怕元组。 那一点使您可以动态的营造choices。 不过假诺您发觉你本人搞不定动态的choices,你最棒也许使用ForeignKey来营造三个适合的数量库表。choices更适合那二个改造不多的静态数据。

all

all方法查询该目的的持有实例。

all_entries = Entry.objects.all()
  • auto_now
    暗中同意值为False,设置为True时会在历次修改该目的时自动更新为当下岁月,可是不能够手动修改该字段的值。
  • auto_now_add
    暗中认可值为False,设置为True时会在创设对象时自动安装为近期时光,之后都不再修改,也不能够手动修改其值。
  • 私下认可当昨天子,又能修改
    突发性大家需求在创设对象时设置字段的值为近来时间,在一而再时又能改改,使用auto_now或者auto_now_add都没办法儿达成那一点。此时,能够使用default参数来设置默许值,如下

除非blank=Falsedefault联机在字段中棉被服装置,不然,可挑选菜单将会有"---------"
的价签。 要重写那一个作为,
需求到场叁个包蕴None的元组到 choices里面; 例如
(None, 'Your String For Display'),对于字符串字段也可以用二个空字符串代替None

get

行使get查询实例,当实例不存在时会再次来到1个不设有非常。

>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
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)

db_index

filter

filter重临2个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 

重写方法

如果True,将为该字段创设七个数据库索引。

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))

上述例子常用在1个搜索框大概找出四个字段的内容时,各样过滤条件之间利用“|”举行只怕运算。当多规格查询时,种种条件是并运算,使用“&”取代“|”。
Q可以复制给个变量,有时候大家必要对Q前面包车型大巴内容先做一些拍卖,如将日期拼凑出来等,那时候能够先把Q赋值给2个变量,然后对变量举办“|”或许“&”操作。

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

delete

db_column

反向查找

反向查找首借使用在外键的情状下,通过被波及对象查找关联对象。

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

除了那个之外上边的用法,还足以采取related_name来拓展反向寻觅,而且当1个模型中有四个字段关联同二个模牛时,在外键中毫无疑问要用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()

Django暗中同意的去除是将数据从数据Curry删除,有时候我们必要软删除,保存在此以前的数量,那时候我们得以运用多个布尔类型的字段标记该条数据是否删除,这时急需重写delete方法实现软删除。

用来代表数据库中该字段的列名称。
假诺未钦定,那么Django将会接纳字段名作为列名.

外键列表

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}]

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

default

save

字段的暗许值,可以是3个值或一个不可变对象,倘诺非要用个字典(可变对象)做暗中认可值,能够这么操作:

重写save方法能够让大家在保存数据时做一些有关的操作,举个例子保留姓名时自动安装为首字母大写,实施完之后要求调用父类的save方法开始展览封存。

def contact_default():
    return {"email": "to1@example.com"}

contact_info = JSONField("ContactInfo", default=contact_default)

repr & str

匿名函数无法用于default的字段选项

三头的效率是将变量只怕常量转变为字符串对象,这里重写该方式使得对象实例能被转发为字符串。

暗中同意值会在新实例创制并且未有给该字段提供值时使用。 要是字段为主键且值为None时,将会动用暗许值

class Meta

editable

  • ordering:结果集遵照何种措施排序,上边例子表示按增添时间的逆序排序
  • verbose_name:对象的名目
  • verbose_name_plural:对象复数格局的称号
  • db_table:在数据库中的表名

假若设置为false,将不会冒出在admin和modelForm中,默以为True

常用方法

error_messages

在对常用方法介绍一些,由于地点的模型包罗字段较多,所以不利用方面创立的模子。这里运用一些普及的模型,通过名字就能够清楚代表的始末,因而就不列出模型了。

error_messages
参数能够让您重写抛出的默许错误音讯。 通过重要字,在字典中相称你要重写的错误音信。

始建实例

error_messages 的 key 值包括 unique,
unique_for_date, invalid, blank, null, 和
invalid_choice

create

help_text

应用create方法能够创立一个模型实例,将各字段在参数中装置各种字段的值。

 对字段的帮扶表达,会议及展览示在表单中,注意在自动生成的表单中,那些值不会进行HTML转义,假设供给选择HTML标签渲染,应该在help_text中包含html:

student = Student.objects.create(name='zhangsan', gender='male')
help_text="Please use the following format: <em>YYYY-MM-DD</em>."

get_or_create

primary_key

get_or_create的效益是查询贰个实例,当实例不设有时则创制三个实例。

 如若为true,则该字段会成为模型的主键字段

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

万壹没有点名该字段,django会自动抬高1个AutoField字段来担任主键

函数重返二个(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()

unique

update_or_create

 假若为true,该字段值再表中务必是头一无二的

update_or_create的效能是翻新1个实例,当实力不设有时则创制多个实例。

此选项对除ManyToMany和OneToOneField之外的具有字段有效

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

当设置了unique为true后,你不再需求设置db_index,因为unique本人就以为着三个目录的成立

函数再次来到一个(object,
created)的tuple,object是立异可能成立的对象实例,created是个布尔类型的值,表示是或不是是新创制的实例。在询问的目的实例存在时,使用default中的参数进行革新,当实例不设有时,创设新的对象实例,需求更新的字段的值设置为default中的值。功效看似:

unique_for_date 

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()

 当它设置为三个Dete菲尔德或DateTimeField字段的称号时,表示该字段的值相对于unique_for_date钦点的字段的日期值是天下无双的

add

 当设置为DateTimeField字段名称时,只会考虑其日期部分,

亚洲必赢官网 ,那边补充一下add方法,add用在多对多的关系模型上,表示增多该字段的针对性对象。

unique_for_year   
unique_for_month

>>> 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)

类似于unique_for_date,只可是是讲求字段对于月份、年份是唯一的

地方的Author表示小编模型,entry表示书籍条目款项,1本书能够有多少个作者,接纳多对多关系。add可感到书的实例增加多个笔者。

verbose_name

查询

 贰个字段的可读性更加高的称呼,假若未有给定自述名,dango将会基于字段名称,将下划线转换为空格自动创制它

all

validators

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

指令该字段验证时要实施的validator列表

all_entries = Entry.objects.all()

字段类型

get

AutoField

动用get查询实例,当实例不设有时会重返三个不存在十分。

二个依据实际ID自动增进的IntegerField,平时无需直接采纳它

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

BigAutoField

filter

一个64位整数,类似于AutoField

filter再次回到多个QuerySet,而不是目的实例,当查问结果不设有时重临空的QuerySet,而不是回去一场,可以对结果集作切丝操作来赢得实例内容。下边代码功效在有对象实例时同样下边get的操作。

BigIntegerField

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

叁个陆12位整数,非常像IntegerField,那么些字段私下认可的表单组件是叁个TextInput

filter结果能够链式地进行操作,也正是背后能够接八个过滤条件。

BinaryField

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

二个用来积存贰进制码的菲尔德,只帮助bytes赋值

上面的pub_date__year表示抽取Date菲尔德类型的pub_date的年,类似的能够收取月__month,日__day。在选拔外键ForeignKey时方可使用双下划线来表示被波及对象的字段。

本条Field的效应很单薄,相当的小可能在贰个二进制数据上拓展询问数据,在ModelForm中也不太或然使用BinaryField

明日来看一下链式过滤的例证。

您大概想选择数据库来存款和储蓄你的文件,可是%9九的情景下那都以3个倒霉的规划

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

BooleanField

先是选拔__startswith过滤题目以’What’开始的数量。然后保留让发布日期小于前几天的数目,exclude代表免除规则内的这部分数码,条件使用了__gte表示大于当前几天期,该部分过滤类似于filter前边使用__lte小于。最后也是利用__gte大于1个自定义的日子。

代表true/false的字段,暗中认可的表单组件是CheckboxInput

除去上面的过滤条件外,常见的还有__icontains,表示包括该内容。

若果必要设置为null值,应该选择NullBooleanField来替代BooleanField

Q

如若未有点名default,该字段的暗许值是None

Q是Django自带的内容,用于查询。首要的用处是在页面包车型大巴研究框中输入内容后台查询相应的数目集。

CharField

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

1个用来存款和储蓄各类长度的字符串的地点,暗中同意的表单组件是TextInput,该字段必须接受二个额外参数:max_length,该参数就要数量库层和Django表单验证中起功能,用来限制长度

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

假若是了不起的公文类型,可用Text菲尔德

Q能够复制给个变量,有时候我们需求对Q后边的内容先做一些拍卖,如将日期拼凑出来等,那时候能够先把Q赋值给1个变量,然后对变量进行“|”只怕“&”操作。

DateField

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

二个用来表示日期的字段,使用python的datetime.date实例来代表日期,私下认可的表单组件是TextInput,有多少个附加的参数:

总结

auto_now:每回保存对象时,自动安装该字段为当昨天子,注意:只用调用了modle.save()是该子段的值才会自动更新,当以任何措施更新字段(如QuerySet.update())时,该字段不会更新

以上就是那篇小说的全体内容了,希望本文的剧情对大家的求学或许办事有着一定的参考学习价值,借使有问号咱们能够留言交换,谢谢大家对台本之家的支撑。

auto_now_add:当对象第贰回被创设时自动安装为当下时刻,尽管在成立对象时为此字段设置了三个值,也将被忽视。假设要让此字段在创制时可感到该字段提供叁个值,如下能得以达成:

你大概感兴趣的篇章:

  • 详解Django model
    update的各类用法介绍
  • django模型中的字段和model名呈现为华语小才能分享
  • django模型层(model)进行建表、查询与删除的基础教程
  • 浅谈django
    model的get和filter方法的界别(必须要看篇)
  • django
    model去掉unique_together报错的减轻方案
  • Django基础之Model操作步骤(介绍)
  • Pycharm 操作Django
    Model的简要利用方式
  • 浅谈django model
    postgres的json字段编码难点
  • Django项目中model的数量处理以及页面交互格局
  • Django model
    select的各样用法示例介绍
  • 对于DateFielddefault=date.today   
    datetime.date.today()
  • 对于DateTimeFielddefault=timezone.now   
    #django.utils.timezone.now()

注意:default、auto_now、auto_now_add这几个设置皆以排斥的

在目前的兑现中,设置了auto_now、auto_now_add为True时,django会自动为该字段设置editable=False和blank=True

DateTimeField

同DateField

DecimalField 

 三个代表浮点数的字段,用python中Decimal的2个实例来表示该字段的值,有几个必须的参数

  1.  max_digits:该浮点数的总位数,包罗小数点前后的位数
  2. decimal_places:小数点后的位数

 EmialField

 也正是CharField,用来检查输入的email地址是不是合法,使用EmailValidator来验证输入的合法性

 FileField

 用于上传文件的字段,不补助primary_key参数

 FloatField

 表示3个浮点数,使用python的float实例来表示

IntegerField 

 表示三个整数,当localizeFalseTextInput时,该字段的私下认可表单小部件是NumberInput

 NullBooleanField

 类似BooleanField, 可是允许 NULL
作为3个选项. 使用该字段代替null=TrueBooleanField字段。 此字段的默许表单widget为NullBooleanSelect

 PositivIntegerField

 类似Integer菲尔德,但值必须是正数或0

SmallIntegerField

就像IntegerField,该值范围视数据库而定,1版对django来说,该值在-3276捌到327陆七时期对于持有扶助的数据库都以安全的

TextField

表示大文本字段,私下认可表单组件是Textarea

 TimeField

 表示时间的字段,默许表单组件TextInput使用python
datetime.time的实例来代表该字段值,接受与DateField一样的电动填充选项

涉嫌关系字段 

 ForignKeyField

 多对一涉嫌,三个必填参数,模型相关类和on_delete选项

如若急需创立递归关联关系,2个对象与自己兼备多对1的涉嫌,使用
‘self’字符串左右模型相关的类

假定要求关联到1个还未创造的模子,你能够应用模型的名字而不用
模型对象自己(使用情状:模型承继),子类化模型时,将会在子类所在模块查找相呼应的模型相关类:

#products/models.py

from django.db import models

class AbstractCar(models.Model):
    manufacturer = models.ForeignKey('Manufacturer', on_delete=models.CASCADE)

    class Meta:
        abstract = True

#production/models.py

from django.db import models
from products.models import AbstractCar

class Manufacturer(models.Model):
    pass

class Car(AbstractCar):
    pass

# Car.manufacturer将指向这里的`production.Manufacturer`。

  若要引用其余应用中的模型,能够使用app_label.modelname来应用,如下:

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'production.Manufacturer',
        on_delete=models.CASCADE,
    )

  那称之为懒惰关系的引用,在消除四个应用之间循环导入时很有用

ForignKey会自动创造数据库索引,能够透过db_Index=False来取消

数据库表示

Django会在字段名上增加“_id”来创制数据库的列名称,也得以通过db_column来修改,可是,除非您编写自定义SQL,不然不要改造数据库列名称。

参数

on_delete 

当删除由ForignKey引用的靶申时,Djanog将效仿由on_delete参数钦点的SQL约束作为

  1. SET_NULL():表示外键关联到的表的多寡被剔除时,外键字段置为空。models.ForeignKey(AuthModel,
    null=True, blank=True,
    on_delete=models.SET_NULL)
  2. CASCADE:级联删除,1并删除包蕴ForignKey的对象
  3. PROTECT:会抛出protectedError,阻止被引用对象的删除,
  4. SET_DEFAULT():删除引用对象后,将设置的默许值左右该外键值
  5. SET():引用表数据删除后,将传递给SET()的值作为外键值,假如传入了贰个可调用对象,则为调用后的结果
  6. DO_NOTHING:不选择任何动作

  limit_choices_to

  当ForignKey字段被admin或ModelForm渲染时,为该字段选项设置标准类过滤选项。它能够是字典、Q对象,或许一个回去字典或Q对象的可调用对象,如:  

  

staff_member = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    limit_choices_to={'is_staff': True},
)

  那将使得ModelForm对应的字段只列出User的is_staff=True的成员

 related_name

  • 本条称呼用于让关系对象反查到源对象。它依然releated_query_name的暗许值(关联模型进行反向过滤时采取的称呼)
  • 若是未钦赐该属性,暗中同意意况下行使FOO_set来反查原模型,FOO是源模型的小写名称
  • 若果不想创立多少个反向关联,将该属性设置为“+”,此时关系模型不可能反向寻找到源模型

related_query_name

 用于指标模型的反向过滤。假如未设置该属性和related_name
则默以为模型名称,假如该属性未设置,设置了related_name
,则使用related_name,倘若该属性设置了值,则运用该属性值:

# Declare the ForeignKey with related_query_name
class Tag(models.Model):
    article = models.ForeignKey(
        Article,
        on_delete=models.CASCADE,
        related_name="tags",
        related_query_name="tag",
    )
    name = models.CharField(max_length=255)

# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")

to_field

 关联到的涉嫌对象的字段名称,私下认可使用关联对象的主键列。就算要涉及到其余字段,那叁个字段应该享有unique=True

ManyToManyField

 多对多涉及关系,供给3个至关心器重要字参数,与该模型关联的类

数据库表示

 在私下,Django创设一在那之中级表来表示多对多关系。私下认可情状下该中间表的称号使用多对多字段名称和多对多字段所在表的称谓组成。你也足以应用db_table选项提供中间表的名号

 参数

 related_name  related_query_name 
limit_choices_to

 与ForignKeyField一样,注意:ManyToManyField 对于利用through
参数自定义中间表的limit_choices_to 不生效

 through

 Django
会自动创设3个表来管理多对多涉及。 不过,假如您愿意手动钦点中介表,能够选取through
选项来钦赐Django 模型来代表您想要使用的中介表。

 那么些选项最广泛的采取境况是当您想要关联更加多的多少到关系关系的时候。

 

一经你从未显式内定through
的模型,照旧会有二个隐式的through
模型类,你可以用它来直接待上访问对应的意味关联关系的数量库表。 它由四个字段来链接模型。

假定源模型和对象差别,则调换以下字段:

    • id:关系的主键。
    • <containing_model>_id:声明了ManyToManyField的模型的id
    • <other_model>_id:
      ManyToManyField所针对的模型的id

如果ManyToManyField 的源模型和对象模型一样,则变化以下字段:

    • id:关系的主键。
    • from_<model>_id:源模型实例的id
    • to_<model>_id:目标模型实例的id

 through_fields

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)

上文示例中Membership 有多少个外键指向Person (person
和inviter),那使得关系关系含混不清并让Django 不知底使用哪三个。

在那种场地下,必须选拔through_田野先生s 鲜明钦定Django 应该使用什么外键

through_田野同志s 接收三个二元组(‘田野同志一’, ‘田野(field)2’),在这之中田野1为指向定义ManyToManyField 字段的模子的外键名称(本例中为group),田野同志二为指向目的模型的外键的名称(本例中为person).

db_table 

默许处境下,关联表的称谓使用多对多字段的称谓和富含这张表的模型的名称以及Hash值生成,如:memberShip_person_3c1f5.若要想要手动指定表的名称,可以使用db_table根本字参数钦命.

 OneToOneField

 1对壹关系,相当于在ForignKey上安装了unique=True

当2个模子要扩充时,那很有用。比如多表承继是透过将叁个隐式一对1关联增加到模型中来落到实处的

亟需三个参数,与该模型关联的类

 

 字段API参考

 Field

 是多个抽象类,用来代表数据库中的1列,具有以下属性

 db_type:再次回到该字段在数据库中的类型,比如你自定义了3个光阴项目,那么对应在MySQL中就是datetime类型。

 rel_db_type:再次来到字段的Field类型,如:ForeignKeyFieldOneToOneField

 

有两种主要意况,Django要求与数据库后端字段交互:

    • 当它查询数据库(Python值 转为
      数据库后端值)
    • 当它从数据库加载数据(数据库后端值 转为
      Python值)
    • 当它保存到数据库(Python值 转为
      数据库后端值)

   get_prep_value():将python值调换为数据库查询参数值

   get_db_prep_value():将查询值转换为数量库值

   from_db_value():将数据库值转变为python值,它与get_prep_value成效相反

 get_db_prep_save():在保留数据库是会调用此办法,暗中同意实现是回去get_db_prep_value()

 prep_save():在get_db_pre-save前调用

 to_python():将2个值调换为不易的python对象。是value_to_string的反向操作会在clean中调用

 value_to_string():将obj调换为字符串,用于连串化字段的值。字段常常会接到差异体系的值,这时就须求种类化。

 字段的质量

 auto_create:布尔标志,提醒字段时否时自动成立

 concreate:布尔标记,提示字段是不是具有与其相关联的数据列

 model:重临定义字段的模型类,借使在模型类的超类上定义了字段,则赶回超类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

网站地图xml地图