1
1
from django .db import models
2
2
from django .contrib .auth .models import User
3
- from django .utils .six import python_2_unicode_compatible
4
3
from django .urls import reverse
4
+ from django .utils .six import python_2_unicode_compatible
5
5
6
6
7
+ # python_2_unicode_compatible 装饰器用于兼容 Python2
7
8
@python_2_unicode_compatible
8
9
class Category (models .Model ):
9
10
"""
10
- django 要求我们必须继承 models.Model 类,
11
+ Django 要求模型必须继承 models.Model 类。
11
12
Category 只需要一个简单的分类名 name 就可以了。
12
-
13
- CharField 指定了 name 的数据类型,
14
- CharField 是字符型,
15
- max_length 指定其最大长度,
16
- 超过这个长度的分类名就不能被存入数据库。
17
-
18
- 当然 django 还为我们提供了各种各样的类型,
19
- 如日期时间类型 DateTimeField、
20
- 整数类型 IntegerField 等等。
21
- django 内置的类型全部类型可查看文档:
13
+ CharField 指定了分类名 name 的数据类型,CharField 是字符型,
14
+ CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
15
+ 当然 Django 还为我们提供了多种其它的数据类型,如日期时间类型 DateTimeField、整数类型 IntegerField 等等。
16
+ Django 内置的全部类型可查看文档:
22
17
https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types
23
18
"""
24
19
name = models .CharField (max_length = 100 )
25
20
26
21
def __str__ (self ):
27
- # python_2_unicode_compatible 装饰器用于兼容 Python2
28
22
return self .name
29
23
30
24
31
25
@python_2_unicode_compatible
32
26
class Tag (models .Model ):
33
27
"""
34
- 标签 Tag 也比较简单,
35
- 和 Category 一样。
28
+ 标签 Tag 也比较简单,和 Category 一样。
36
29
再次强调一定要继承 models.Model 类!
37
30
"""
38
31
name = models .CharField (max_length = 100 )
39
32
40
33
def __str__ (self ):
41
- # python_2_unicode_compatible 装饰器用于兼容 Python2
42
34
return self .name
43
35
44
36
@@ -52,60 +44,38 @@ class Post(models.Model):
52
44
title = models .CharField (max_length = 70 )
53
45
54
46
# 文章正文,我们使用了 TextField。
55
- # 比较短的字符串存储可以使用 CharField,
56
- # 但对于文章的正文来说可能会是一大段文本,
57
- # 因此使用 TextField 来存储大段文本。
47
+ # 存储比较短的字符串可以使用 CharField,但对于文章的正文来说可能会是一大段文本,因此使用 TextField 来存储大段文本。
58
48
body = models .TextField ()
59
49
60
- # 这两个列分表表示了文章的创建时间和最后一次修改时间,
61
- # 存储时间的列用 DateTimeField。
50
+ # 这两个列分别表示文章的创建时间和最后一次修改时间,存储时间的字段用 DateTimeField 类型。
62
51
created_time = models .DateTimeField ()
63
52
modified_time = models .DateTimeField ()
64
53
65
- # 文章摘要,可以没有文章摘要,
66
- # 但默认情况下 CharField 要求我们必须存入数据,
67
- # 否则就会报错。
68
- # 指定 blank=True 后就可以允许空值了。
54
+ # 文章摘要,可以没有文章摘要,但默认情况下 CharField 要求我们必须存入数据,否则就会报错。
55
+ # 指定 CharField 的 blank=True 参数值后就可以允许空值了。
69
56
excerpt = models .CharField (max_length = 200 , blank = True )
70
57
71
- # 这是分类与标签,
72
- # 分类与标签的模型我们已经定义在上面。
73
- # 我们在这里把文章对应的数据库表和分类与标签对应的表关联起来,
74
- # 但是关联形式稍微有点不同。
75
- # 我们规定一篇文章只能对应一个分类,
76
- # 但是一个分类下可以有很多篇文章,
77
- # 所以我们使用的是 ForeignKey,
78
- # 即一对多的关系。
79
- # 而对于标签来说,
80
- # 一篇文章可以有多个标签,
81
- # 同一个标签下也可能有多篇文章,
82
- # 所以我们使用 ManyToManyField,
83
- # 表明这是多对多的关系。
84
- # 同时我们规定文章可以没有标签,
85
- # 因此为标签 tags 指定了 blank=True。
86
- # 如果你对 ForeignKey、ManyToManyField 不了解,
87
- # 请看教程中的解释,
88
- # 亦可参考官方文档:
58
+ # 这是分类与标签,分类与标签的模型我们已经定义在上面。
59
+ # 我们在这里把文章对应的数据库表和分类、标签对应的数据库表关联了起来,但是关联形式稍微有点不同。
60
+ # 我们规定一篇文章只能对应一个分类,但是一个分类下可以有多篇文章,所以我们使用的是 ForeignKey,即一对多的关联关系。
61
+ # 而对于标签来说,一篇文章可以有多个标签,同一个标签下也可能有多篇文章,所以我们使用 ManyToManyField,表明这是多对多的关联关系。
62
+ # 同时我们规定文章可以没有标签,因此为标签 tags 指定了 blank=True。
63
+ # 如果你对 ForeignKey、ManyToManyField 不了解,请看教程中的解释,亦可参考官方文档:
89
64
# https://docs.djangoproject.com/en/1.10/topics/db/models/#relationships
90
65
category = models .ForeignKey (Category )
91
66
tags = models .ManyToManyField (Tag , blank = True )
92
67
93
- # 文章作者
94
- # 这里 User 是从 django.contrib.auth.models 导入的。
95
- # django.contrib.auth 是 django 内置的应用,
96
- # 专门用于处理网站用户的注册、登录等流程,
97
- # User 是 django 为我们已经写好的用户模型,
98
- # 这里我们通过 ForeignKey 把文章和 User 关联起来,
99
- # 因为我们规定一篇文章只能有一个作者,
100
- # 而一个作者可能会写多篇文章,
101
- # 因此这是一对多的关系,
102
- # 和 Category 类似。
68
+ # 文章作者,这里 User 是从 django.contrib.auth.models 导入的。
69
+ # django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。
70
+ # 这里我们通过 ForeignKey 把文章和 User 关联了起来。
71
+ # 因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
103
72
author = models .ForeignKey (User )
104
73
105
74
def __str__ (self ):
106
- # python_2_unicode_compatible 装饰器用于兼容 Python2
107
75
return self .title
108
76
77
+ # 自定义 get_absolute_url 方法
78
+ # 记得从 django.urls 中导入 reverse 函数
109
79
def get_absolute_url (self ):
110
80
return reverse ('blog:detail' , kwargs = {'pk' : self .pk })
111
81
0 commit comments