文章目录
配置mysql
修改配置文件
settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysql',
'USER': 'root',
'PASSWORD': 'Abc@12345678',
'HOST': '127.0.0.1',
'POST': 3306,
}
}
安装mysqlclient
brew install mysql-client
echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
export PATH="/usr/local/opt/mysql-client/bin:$PATH"
pip install mysqlclient
定义表
models.py
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
创建表
python manage.py makemigrations mysite
python manage.py migrate mysite
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CAdzt5ho-1597559662551)(/Users/admin/Library/Application Support/typora-user-images/image-20200730112150749.png)]
字段类型
AutoField
自增主键
BigAutoField
自增主键,64位整型,从1
到 9223372036854775807
.
BigIntegerField
64位整型, 从-9223372036854775808
到 9223372036854775807
BooleanField
布尔类型,True或者False
CharField
字符串类型
class CharField
(max_length=None, options)**
DateField
日期类型,对应python的datetime.date
类型
class DateField
(auto_now=False, auto_now_add=False**,** options)**[
- DateField.auto_now 内容每次更新时都会自动更新该字段
- DateField.auto_now_add 内容创建时自动更新该字段
DateTimeField
对应python的datetime.datetimel
类型和DateFile接收相同的参数
DecimalField
固定精度的10进制数字,对应python中的Decimal
类型
字段选项
null
如果设置为 True
,当该字段为空时,Django 会将数据库中该字段设置为 NULL
。默认为 False
。
blank
如果设置为 True
,该字段允许为空。默认为 False
。
注意该选项与null
不同, null
选项仅仅是数据库层面的设置,然而 blank
是涉及表单验证方面。如果一个字段设置为 blank=True
,在进行表单验证时,接收的数据该字段值允许为空,而设置为blank=False
时,不允许为空。
choices
一系列二元组,用作此字段的选项。如果提供了二元组,默认表单小部件是一个选择框,而不是标准文本字段,并将限制给出的选项。
一个选项列表:
YEAR_IN_SCHOOL_CHOICES = [
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
]
每个二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示。
对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 get_FOO_display()
方法。例如:
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'
你也可以使用枚举类以简洁的方式来定义 choices
:
from django.db import models
class Runner(models.Model):
MedalType = models.TextChoices('MedalType', 'GOLD SILVER BRONZE')
name = models.CharField(max_length=60)
medal = models.CharField(blank=True, choices=MedalType.choices, max_length=10)
default
该字段的默认值。可以是一个值或者是个可调用的对象,如果是个可调用对象,每次实例化模型时都会调用该对象。
help_text
额外的“帮助”文本,随表单控件一同显示。即便你的字段未用于表单,它对于生成文档也是很有用的。
primary_key
如果设置为 True
,将该字段设置为该模型的主键。
在一个模型中,如果你没有对任何一个字段设置 primary_key=True
选项。 Django 会自动添加一个 IntegerField
字段,并设置为主键,因此除非你想重写 Django 默认的主键设置行为,你可以不手动设置主键。
主键字段是只可读的,如果你修改一个模型实例的主键并保存,这等同于创建了一个新的模型实例。例如:
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)
<QuerySet ['Apple', 'Pear']>
自动设置主键
默认情况下, Django 会给每一个模型添加下面的字段:
id = models.AutoField(primary_key=True)
unique
如果设置为 True
,这个字段的值必须在整个表中保持唯一
vervbose_name
除了 ForeignKey
, ManyToManyField
和 OneToOneField
,任何字段类型都接收一个可选的位置参数 `verbose_name如果未指定该参数值, Django 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。
在该例中:备注名为 "person's first name"
:
first_name = models.CharField("person's first name", max_length=30)
在该例中:备注名为 "first name"
:
first_name = models.CharField(max_length=30)
ForeignKey
, ManyToManyField
和 OneToOneField
接收的第一个参数为模型的类名,后面可以添加一个 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",
)
惯例是不将 verbose_name
的首字母大写,必要时 Djanog 会自动把首字母转换为大写。
db_column
指定列名,覆盖默认名称
db_index
如果设置为True,则数据库为该字段创建索引
unique
如果设置为 True
,这个字段必须在整个表中保持值唯一。
关联关系
多对一关联
定义一个多对一的关联关系,使用 django.db.models.ForeignKey
类。就和其它 Field
字段类型一样,只需要在你模型中添加一个值为该类的属性。
ForeignKey
类需要添加一个位置参数,即你想要关联的模型类名。
例如,如果一个 Car
模型有一个制造者 Manufacturer
--就是说一个 Manufacturer
制造许多辆车,但是每辆车都仅有一个制造者-- 那么使用下面的方法定义这个关系:
from django.db import models
class Manufacturer(models.Model):
# ...
pass
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
# ...
多对多关联
定义一个多对多的关联关系,使用 django.db.models.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)
和 `ForeignKey类一样,你也可以创建 自关联关系(一个对象与他本身有着多对多的关系)和 与未定义的模型的关系。
建议设置 ManyToManyField
字段名(上例中的 toppings
)为一个复数名词,表示所要光联的模型对象的集合。
对于多对多光联关系的两个模型,可以在任何一个模型中添加 ManyToManyField
字段,但只能选择一个模型设置该字段,即不能同时在两模型中添加该字段。
一般来讲,应该把 ManyToManyField
实例放到需要在表单中被编辑的对象中。在之前的例子中, toppings
被放在 Pizza
当中(而不是 Topping
中有指向 pizzas
的 ManyToManyField
因为相较于配料被放在不同的披萨当中,披萨当中有很多种配料更加符合常理。按照先前说的,在编辑 Pizza
的表单时用户可以选择多种配料。
一对一关联
Meta选项
abstract: abstract类型
db_table:表名
get_latest_by:在model中指定一个DateField或者DateTimeField。这个设置让你在使用model的Manager上的lastest方法时,默认使用指定字段来排序
ordering:对象返回的记录结果集是按照哪个字段排序的。这是一个字符串的元组或列表,没有一个字符串都是一个字段和用一个可选的表明降序的’-‘构成。当字段名前面没有’-‘时,将默认使用升序排列。使用’?’将会随机排列
indexes:在表中定义的索引列表
unique_together:多个字段同时唯一
index_together:联合索引
constraints:约束
verbose_name:人类可读的名称