Django模型

13 篇文章 0 订阅
3 篇文章 0 订阅

字段选项

每个字段有一些特有的参数,这里我们只简单介绍一些最常用的

null

如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

blank

如果为True,该字段允许不填。默认为False

要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

choices

由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。

这是一个关于 choices 列表的例子:

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

每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

default

字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

help_text

表单部件额外显示的帮助内容。即使字段不在表单中使用,它对生成文档也很有用。

primary_key

如果为True,那么这个字段就是模型的主键。

如果你没有指定任何一个字段的primary_key=True,Django 就会自动添加一个IntegerField 字段做为主键,所以除非你想覆盖默认的主键行为,否则没必要设置任何一个字段的primary_key=True

主键字段是只读的。如果你在一个已存在的对象上面更改主键的值并且保存,一个新的对象将会在原有对象之外创建出来。例如:

from django.db import models

class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)

>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
['Apple', 'Pear']

unique

如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

每个字段类型都接受一个可选的位置参数 —— 字段的自述名。如果没有给定自述名,Django 将根据字段的属性名称自动创建自述名 —— 将属性名称的下划线替换成空格。

字段类型

Django 自带数十种内置的字段类型。如果内置类型仍不能满足你的要求,你可以自由地编写符合你要求的字段类型。

AutoField

一个根据实际ID自动增长的IntegerField。用来自定义主键字段。Django是自动创建主键字段,所以可以不设置主键字段。

CharField

字符串字段,必须设置max_length的值

TextField

内容过多,可以设置成文本类型

IntegerField

 整数类型

FloatField

 浮点类型

关系

显然,关系数据库的威力体现在表之间的相互关联。 Django 提供了三种最常见的数据库关系:多对一(many-to-one),多对多(many-to-many),一对一(one-to-one)。

多对一关系

Django 使用 django.db.models.ForeignKey 定义多对一关系。和使用其它字段类型一样:在模型当中把它做为一个类属性包含进来。

ForeignKey 需要一个位置参数:与该模型关联的类。

比如,一辆Car有一个Manufacturer —— 但是一个Manufacturer 生产很多Car,每一辆Car 只能有一个Manufacturer—— 使用下面的定义:

from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer)
    # ...
建议你用被关联的模型的小写名称做为ForeignKey 字段的名字(例如,上面manufacturer)。当然,你也可以起别的名字。
多对多关系

ManyToManyField 用来定义多对多关系,用法和其他Field 字段类型一样:在模型中做为一个类属性包含进来。

ManyToManyField 需要一个位置参数:和该模型关联的类。

例如,一个Pizza可以有多种Topping —— 一种Topping 可以位于多个Pizza 上,而且每个Pizza 可以有多种Topping —— 如下:

from django.db import models

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

建议你以被关联模型名称的复数形式做为ManyToManyField 的名字(例如上例中的toppings)。

在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可 —— 不要两个模型都设置。

元选项

使用内部的class Meta 定义模型的元数据,例如:

from django.db import models

class Course(models.Model):
    name = models.charField(default="",max_length=50,verbose_name=u'课程名称')
    desc = models.CharField(max_length=100,verbose_name=u'课程描述')
    class Meta:
        verbose_name = u'课程表'
        verbose_name_plural = verbose_name

模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据表名(db_table)或者人类可读的单复数名称(verbose_name 和verbose_name_plural)。在模型中添加class Meta是完全可选的,所有选项都不是必须的。

基本操作


1、插入数据

Python代码  
  1. >>> from books.models import Publisher  
  2. >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',  
  3. ...     city='Berkeley', state_province='CA', country='U.S.A.',  
  4. ...     website='http://www.apress.com/')  
  5. >>> p1.save()  

2、查询

Python代码  
  1. >>> Publisher.objects.all()  
  2. [<Publisher: Apress>, <Publisher: O'Reilly>]  

获取单个对象:

Python代码  
  1. >>> Publisher.objects.get(name="Apress")  
  2. <Publisher: Apress>  
如果结果是多个对象或者没有返回结果则会抛出异常


3、条件

筛选:

Python代码  
  1. >>> Publisher.objects.filter(name='Apress')  
  2. [<Publisher: Apress>]  

Python代码  
  1. >>> Publisher.objects.filter(name__contains="press")  
  2. [<Publisher: Apress>]  

__contains部分会被Django翻译成LIKE语句

__icontains 对大小写不敏感

Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

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

排序:

Python代码  
  1. >>> Publisher.objects.order_by("name")  
  2. [<Publisher: Apress>, <Publisher: O'Reilly>]  

相当于 order by name asc

Python代码  
  1. >>> Publisher.objects.order_by("-name")  
加个负号相当于 order by name desc


限制返回数据:

Python代码  
  1. >>> Publisher.objects.order_by('name')[0]  
  2. <Publisher: Apress>  
相当于 limit 1
Python代码  
  1. >>> Publisher.objects.order_by('name')[0:2]  

相当于 OFFSET 0 LIMIT 2


4、更新

Python代码  
  1. >>> Publisher.objects.filter(id=52).update(name='Apress Publishing')  

Python代码  
  1. >>> p = Publisher.objects.get(name='Apress'#先查询  
  2. >>> p.name = 'Apress Publishing' #更新  
  3. >>> p.save()  #保存  

5、删除
Python代码  
  1. >>> p = Publisher.objects.get(name="O'Reilly")  
  2. >>> p.delete()  

Python代码  
  1. >>> Publisher.objects.filter(country='USA').delete()  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值