字段选项
每个字段有一些特有的参数,这里我们只简单介绍一些最常用的
如果为True
,Django 将用NULL
来在数据库中存储空值。 默认值是 False
.
如果为True
,该字段允许不填。默认为False
。
要注意,这与 null
不同。null
纯粹是数据库范畴的,而 blank
是数据验证范畴的。如果一个字段的blank=True
,表单的验证将允许该字段是空值。如果字段的blank=False
,该字段就是必填的。
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了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'
字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
表单部件额外显示的帮助内容。即使字段不在表单中使用,它对生成文档也很有用。
如果为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']
如果该值设置为 True
, 这个数据字段的值在整张表中必须是唯一的
每个字段类型都接受一个可选的位置参数 —— 字段的自述名。如果没有给定自述名,Django 将根据字段的属性名称自动创建自述名 —— 将属性名称的下划线替换成空格。
字段类型
Django 自带数十种内置的字段类型。如果内置类型仍不能满足你的要求,你可以自由地编写符合你要求的字段类型。
一个根据实际ID自动增长的IntegerField。用来自定义主键字段。Django是自动创建主键字段,所以可以不设置主键字段。
字符串字段,必须设置max_length的值
内容过多,可以设置成文本类型
整数类型
浮点类型
关系
显然,关系数据库的威力体现在表之间的相互关联。 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、插入数据
- >>> from books.models import Publisher
- >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
- ... city='Berkeley', state_province='CA', country='U.S.A.',
- ... website='http://www.apress.com/')
- >>> p1.save()
2、查询
- >>> Publisher.objects.all()
- [<Publisher: Apress>, <Publisher: O'Reilly>]
获取单个对象:
- >>> Publisher.objects.get(name="Apress")
- <Publisher: Apress>
3、条件
筛选:
- >>> Publisher.objects.filter(name='Apress')
- [<Publisher: Apress>]
- >>> Publisher.objects.filter(name__contains="press")
- [<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
排序:
- >>> Publisher.objects.order_by("name")
- [<Publisher: Apress>, <Publisher: O'Reilly>]
相当于 order by name asc
- >>> Publisher.objects.order_by("-name")
限制返回数据:
- >>> Publisher.objects.order_by('name')[0]
- <Publisher: Apress>
- >>> Publisher.objects.order_by('name')[0:2]
相当于 OFFSET 0 LIMIT 2
4、更新
- >>> Publisher.objects.filter(id=52).update(name='Apress Publishing')
- >>> p = Publisher.objects.get(name='Apress') #先查询
- >>> p.name = 'Apress Publishing' #更新
- >>> p.save() #保存
5、删除
- >>> p = Publisher.objects.get(name="O'Reilly")
- >>> p.delete()
- >>> Publisher.objects.filter(country='USA').delete()