Django之models database总结(一)

通常, 一个model关联一个数据库表。

1. model基础点:

  • 每个model都是django.db.models.Model的子python类
  • 每个model的属性都代表一个数据库字段,也就是数据库的某一列。
  • Django给我们自动产生数据库访问接口
    举例:
from django.db import models
class Person(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)

注明

  • 表名如果不指定,将自动来源于model的元数据,上面的例子的表名会为myapp.person.
  • 会自动添加一个id字段,但这种行为是可以覆盖的,也就是说我们可以自行设定主键.

在执行manage.py migrate,命令之前,确保app的名称已将加入到INSTALLED_APPS的设置当中。当然了,manage.py makemigrations命令是可选的.

2. Field

model最重要的一部分,也是model必须的一部分就是一系列字段的定义。注意:
model中的每个字段都应该是合适的Field类实例。django用字段类的类型来决定一下内容:

1.列的类型,告诉数据库应存储什么类型的数据
2.渲染表单字段时,使用的默认的html组件。
3.用在django admin和自动产生form中,最低要求的验证需求。

每个字段都需要一些特定的参数,例如,CharField字段的max_length参数是必须的,用来指定数据库字段的存储数据的大小。同时,也有一些可选的参数,简单的总结如下:

  • null ,值为True or False.默认为False,如果为True,django就会在数据库中存储空值,即null.
  • black,值为True or False,默认为False,如果为True,字段允许为空,即不填写任何值。
  • choices,一个二元组的迭代器,用来form字段的选择项。如果有值,默认是form表单组件为下拉选框,一个choices 类型如下:
YEAR_IN_SCHOOL_CHOICES = (
   ('FR', 'Freshman'),
  ('SO', 'Sophomore'),
  ('JR', 'Junior'),
  ('SR', 'Senior'),
  ('GR', 'Graduate'),
)

元祖元祖中的元祖第一个元素是数据库要存储的值,第二个元素在表单组件上展示。给定一个model实例,choices字段的展示值可通过get_FOO_method()方法来访问。例如:

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,该字段将变成model的主键。如果不指定具体的字段 primary_key属性,django会帮我们新增一个id字段,但是,如果你指定了某个字段的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,那么该字段的值在全表中都要是唯一的。
  • Verbose field names,每个字段类型,除了ForeignKey,ManyToManyField,OneToOneField,都可以接受一个可选的第一个位置参数,就是verbose name.如果不指定verbose name,django会自动创建它,使用字段的属性名,把下划线转换为空格。例如:
    first_name = models.CharField("person's first name", max_length=30)这个字段的verbose name为person's first name
    first_name = models.CharField(max_length=30)而这个字段的verbose name就是first name
    ForeignKey, ManyToManyField 和OneToOneField 需要第一个参数为一个model类,所以使用verbose_name关键字参数来指定verbose name。
poll = models.ForeignKey(
   Poll,
   on_delete=models.CASCADE,
     verbose_name="the related poll",
   )
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
   Place,
   on_delete=models.CASCADE,
      verbose_name="related place",
   )

你可能感兴趣的:(Django之models database总结(一))