Python Web Development With Django Ch4

第4章定义和使用模型

(未整理完,待续)

4.1定义模型

字段类型

在model中的每一个字段都必须是Field类的一个实例。

  • CharField和TextField:
  • EmailField 、URLField和IPAddressField
  • BooleanField和NullBooleanField
  • FileField

Django使用字段类型确定下面几件事情:
1、数据库字段的类型
2、在admin界面中使用的html组建,比如是文本框,还是单选框等。
3、验证。

主键和唯一性
模型之间的关系
  • 外键
多对多关系
用一对一关系进行纽合
限制关系
class Author(models.Model):
  name = models.CharField(max_length=100)
 
  class SmithBook(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author, lirnit_choices_to={
      'name_endswith': 'Smith'
    })

模型继承

抽象基础类
class Author(models.Model):
  name = models.CharField(max_length=100)
 
  class Book(models.Model):
    title = models.CharField(max_length=100)
    genre = models.CharField(max_length=100)
    num_pages = models.lntegerField()
    authors = models.ManyToManyField(uthor)
 
  def _unicode(self) :
    return self.title
 
  class Meta:
    abstract = True
 
  class SmithBook(Book):
    authors = models.ManyToManyField(Author , limit_choices_to={
      'name_endswith': 'Smith'
    })
多重继承
class Author(rnodels.Model):
  narne = rnodels.CharField(rnax_length=100)
 
  class Book(rnodels.Model):
    title = rnodels.CharField{rnax_length=100)
    genre = rnodels.CharField(rnax_length=100)
    num_pages = rnodels.lntegerField()
    authors = rnodels.ManyToManyField(Author)
 
  def _unicode(self) :
    return self.title
  class SrnithBook(Book):
    authors = rnodels.ManyToManyField(Author , lirnit_choices_to={
      'name_endswith': 'Smith'
    })

Meta嵌套类

class Book(models.Model):
  title = models.CharField(rnax_length=100)
  authors = models.ManyToManyField (Author)
 
  class Meta:
    # Alphabetical order
    ordering = [' title']
 
class Person(models.Model):
  first = models.CharField(max_length=100)
  last = models. Cha.rField (max_length=100)
  middle = models.CharField(max_length=100 , blank=True)
 
  class Meta:
  # The proper way to order people, assuming a Last , First Middle. style of
  # display.
  ordering = [' last' , 'first', 'middle']
  # Here we encode the fact that we cl't have a person with a 100
  # identical name. Of course. in real life. we could. but we'll pretend
  # this is an ideal world.
  unique_together = [. first'. 'last'. 'rniddle]
  # Django's default pluralization is sirnply to add 's' to the end: that
  # doesn't work here.
  verbose_name_plural = 'people'

Admin 注册和选项

  • 列表格式化
  • 表单显示

字段选项

每一个字段都有一些参数,比如CharField字段有一个max-length的参数,表示字段类型的长度。

Django定义了一些所有字段(类)都有的公共的参数,下面简单的总结一下他们的使用:

  • null 如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False
  • blank 如果是True,那么这个字段是可以不填的。默认是False

blank和null的区别:null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的。
如果blank=False,那么这个字段就是必填的。

  • choices 一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框,并且限定choices的值是元组中的值
  • default 可以设置字段的默认值,它可以是一个普通的值,或者是一个可以调用(callable)的对象,如果是一个callable的对象,那么每次调用的时候都会创建一个新的对象。
  • primary_key:

如果是True,那么这个字段就是这个表的主键。
如果在model的字段上没有定义primary_key=True,那么Django会自动添加一个IntegerField(id)类型的字段,作为主键。所以一般情况下你不需要设置这个属性,除非你不想使用默认的设置。

  • unique 如果Ture,设定字段的值是唯一的。

特殊字段

  • Automatic primary key fields 默认情况下,Django会自动为每一个model定义如下字段:

id = models.AutoField(primary_key=True) 这是一个自增长的主键
你可以在任何一个字段上设置primary_key=True,如果Django发现你定义了这个属性,他就不会自动添加id字段了

  • Verbose field names 除了ForeignKey,ManyToManyField,OneToOneField外,每一个field类型的第一个参数,是一个可选参数 -Verbose field names。如果没有这个参数,Django会自动的按照字段的名称创建一个。两个单词之间会用空格分割。

verbose name 是Person's first name
first_name = models.CharField("Person's first name", max_length=30) # verbose name是 first name
first_name = models.CharField(max_length=30)

  • ForeignKey, ManyToManyField and OneToOneField 要求第一个字段必须是一个model class,所以你可以使用关键字参数定义verbose name:

poll = models.ForeignKey(Poll, verbose_name="the related poll")
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(Place, verbose_name="related place")
这里约定verbose name的第一个字母不要大写。Django会在需要的时候,自动转化为大写。

  • Relationships

Django定一个三种通用的类型,去描述数据库表之间的关系:
many-to-one, many-to-many and one-to-one.

  • Many-to-one relationships:

使用ForeignKey来定一个Many-to-one的关联关系。就像使用普通的Field一样。
ForeignKey的第一个参数必须定义这个model与哪一个model关联
比如,Car model有一个Manufacturer:一个制造厂(one)可以生产很多汽车(Many),但是一个汽车只能有一个制造厂

4.2使用模型

表4.1 manage.py函数

manage.py 函数 描述
syncdb 创建所有应用程序所需的数据表
sql 显示CREATE TABLE调用
sqlall 如同上面的sql一样从sql文件中初始化数据载入语句
sqlindexes 显示对主键创建索引的调用
sqlclear 显示DROPTABLE调用
sqlreset sqIclear和sql的组合(DROP加CREATE)
sqlcustom 显示指定sql文件里的自定义SQL语句
loaddata 载入初始数据(和sqlcustom类似,但是这里没有原始SQL)
dumpdata 把现有数据库里的数据输出为JSON , XML等格式

4.3总结