Skip to content

Commit 3ec446a

Browse files
committed
Django个人博客 之 Model的设计
1 parent 02a19cd commit 3ec446a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

86 files changed

+4149
-0
lines changed

Django/Django_blog/step3/blog/__init__.py

Whitespace-only changes.
154 Bytes
Binary file not shown.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.contrib import admin
2+
3+
# Register your models here.
211 Bytes
Binary file not shown.
Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
import django.contrib.auth.models
6+
import django.utils.timezone
7+
from django.conf import settings
8+
import django.core.validators
9+
10+
11+
class Migration(migrations.Migration):
12+
13+
dependencies = [
14+
('auth', '0006_require_contenttypes_0002'),
15+
]
16+
17+
operations = [
18+
migrations.CreateModel(
19+
name='User',
20+
fields=[
21+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
22+
('password', models.CharField(max_length=128, verbose_name='password')),
23+
('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
24+
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
25+
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=30, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, verbose_name='username')),
26+
('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)),
27+
('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
28+
('email', models.EmailField(max_length=254, verbose_name='email address', blank=True)),
29+
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
30+
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
31+
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
32+
('avatar', models.ImageField(default=b'avatar/default.png', upload_to=b'avatar/%Y/%m', max_length=200, blank=True, null=True, verbose_name=b'\xe7\x94\xa8\xe6\x88\xb7\xe5\xa4\xb4\xe5\x83\x8f')),
33+
('qq', models.CharField(max_length=20, null=True, verbose_name=b'QQ\xe5\x8f\xb7\xe7\xa0\x81', blank=True)),
34+
('mobile', models.CharField(max_length=11, unique=True, null=True, verbose_name=b'\xe6\x89\x8b\xe6\x9c\xba\xe5\x8f\xb7\xe7\xa0\x81', blank=True)),
35+
('url', models.URLField(max_length=100, null=True, verbose_name=b'\xe4\xb8\xaa\xe4\xba\xba\xe7\xbd\x91\xe9\xa1\xb5\xe5\x9c\xb0\xe5\x9d\x80', blank=True)),
36+
('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', verbose_name='groups')),
37+
('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')),
38+
],
39+
options={
40+
'ordering': ['-id'],
41+
'verbose_name': '\u7528\u6237',
42+
'verbose_name_plural': '\u7528\u6237',
43+
},
44+
managers=[
45+
('objects', django.contrib.auth.models.UserManager()),
46+
],
47+
),
48+
migrations.CreateModel(
49+
name='Ad',
50+
fields=[
51+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
52+
('title', models.CharField(max_length=50, verbose_name=b'\xe5\xb9\xbf\xe5\x91\x8a\xe6\xa0\x87\xe9\xa2\x98')),
53+
('description', models.CharField(max_length=200, verbose_name=b'\xe5\xb9\xbf\xe5\x91\x8a\xe6\x8f\x8f\xe8\xbf\xb0')),
54+
('image_url', models.ImageField(upload_to=b'ad/%Y/%m', verbose_name=b'\xe5\x9b\xbe\xe7\x89\x87\xe8\xb7\xaf\xe5\xbe\x84')),
55+
('callback_url', models.URLField(null=True, verbose_name=b'\xe5\x9b\x9e\xe8\xb0\x83url', blank=True)),
56+
('date_publish', models.DateTimeField(auto_now_add=True, verbose_name=b'\xe5\x8f\x91\xe5\xb8\x83\xe6\x97\xb6\xe9\x97\xb4')),
57+
('index', models.IntegerField(default=999, verbose_name=b'\xe6\x8e\x92\xe5\x88\x97\xe9\xa1\xba\xe5\xba\x8f(\xe4\xbb\x8e\xe5\xb0\x8f\xe5\x88\xb0\xe5\xa4\xa7)')),
58+
],
59+
options={
60+
'ordering': ['index', 'id'],
61+
'verbose_name': '\u5e7f\u544a',
62+
'verbose_name_plural': '\u5e7f\u544a',
63+
},
64+
),
65+
migrations.CreateModel(
66+
name='Article',
67+
fields=[
68+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
69+
('title', models.CharField(max_length=50, verbose_name=b'\xe6\x96\x87\xe7\xab\xa0\xe6\xa0\x87\xe9\xa2\x98')),
70+
('desc', models.CharField(max_length=50, verbose_name=b'\xe6\x96\x87\xe7\xab\xa0\xe6\x8f\x8f\xe8\xbf\xb0')),
71+
('content', models.TextField(verbose_name=b'\xe6\x96\x87\xe7\xab\xa0\xe5\x86\x85\xe5\xae\xb9')),
72+
('click_count', models.IntegerField(default=0, verbose_name=b'\xe7\x82\xb9\xe5\x87\xbb\xe6\xac\xa1\xe6\x95\xb0')),
73+
('is_recommend', models.BooleanField(default=False, verbose_name=b'\xe6\x98\xaf\xe5\x90\xa6\xe6\x8e\xa8\xe8\x8d\x90')),
74+
('date_publish', models.DateTimeField(auto_now_add=True, verbose_name=b'\xe5\x8f\x91\xe5\xb8\x83\xe6\x97\xb6\xe9\x97\xb4')),
75+
],
76+
options={
77+
'ordering': ['-date_publish'],
78+
'verbose_name': '\u6587\u7ae0',
79+
'verbose_name_plural': '\u6587\u7ae0',
80+
},
81+
),
82+
migrations.CreateModel(
83+
name='Category',
84+
fields=[
85+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
86+
('name', models.CharField(max_length=30, verbose_name=b'\xe5\x88\x86\xe7\xb1\xbb\xe5\x90\x8d\xe7\xa7\xb0')),
87+
('index', models.IntegerField(default=999, verbose_name=b'\xe5\x88\x86\xe7\xb1\xbb\xe7\x9a\x84\xe6\x8e\x92\xe5\xba\x8f')),
88+
],
89+
options={
90+
'ordering': ['index', 'id'],
91+
'verbose_name': '\u5206\u7c7b',
92+
'verbose_name_plural': '\u5206\u7c7b',
93+
},
94+
),
95+
migrations.CreateModel(
96+
name='Comment',
97+
fields=[
98+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
99+
('content', models.TextField(verbose_name=b'\xe8\xaf\x84\xe8\xae\xba\xe5\x86\x85\xe5\xae\xb9')),
100+
('username', models.CharField(max_length=30, null=True, verbose_name=b'\xe7\x94\xa8\xe6\x88\xb7\xe5\x90\x8d', blank=True)),
101+
('email', models.EmailField(max_length=50, null=True, verbose_name=b'\xe9\x82\xae\xe7\xae\xb1\xe5\x9c\xb0\xe5\x9d\x80', blank=True)),
102+
('url', models.URLField(max_length=100, null=True, verbose_name=b'\xe4\xb8\xaa\xe4\xba\xba\xe7\xbd\x91\xe9\xa1\xb5\xe5\x9c\xb0\xe5\x9d\x80', blank=True)),
103+
('date_publish', models.DateTimeField(auto_now_add=True, verbose_name=b'\xe5\x8f\x91\xe5\xb8\x83\xe6\x97\xb6\xe9\x97\xb4')),
104+
('article', models.ForeignKey(verbose_name=b'\xe6\x96\x87\xe7\xab\xa0', blank=True, to='blog.Article', null=True)),
105+
('pid', models.ForeignKey(verbose_name=b'\xe7\x88\xb6\xe7\xba\xa7\xe8\xaf\x84\xe8\xae\xba', blank=True, to='blog.Comment', null=True)),
106+
('user', models.ForeignKey(verbose_name=b'\xe7\x94\xa8\xe6\x88\xb7', blank=True, to=settings.AUTH_USER_MODEL, null=True)),
107+
],
108+
options={
109+
'verbose_name': '\u8bc4\u8bba',
110+
'verbose_name_plural': '\u8bc4\u8bba',
111+
},
112+
),
113+
migrations.CreateModel(
114+
name='Links',
115+
fields=[
116+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
117+
('title', models.CharField(max_length=50, verbose_name=b'\xe6\xa0\x87\xe9\xa2\x98')),
118+
('description', models.CharField(max_length=200, verbose_name=b'\xe5\x8f\x8b\xe6\x83\x85\xe9\x93\xbe\xe6\x8e\xa5\xe6\x8f\x8f\xe8\xbf\xb0')),
119+
('callback_url', models.URLField(verbose_name=b'url\xe5\x9c\xb0\xe5\x9d\x80')),
120+
('date_publish', models.DateTimeField(auto_now_add=True, verbose_name=b'\xe5\x8f\x91\xe5\xb8\x83\xe6\x97\xb6\xe9\x97\xb4')),
121+
('index', models.IntegerField(default=999, verbose_name=b'\xe6\x8e\x92\xe5\x88\x97\xe9\xa1\xba\xe5\xba\x8f(\xe4\xbb\x8e\xe5\xb0\x8f\xe5\x88\xb0\xe5\xa4\xa7)')),
122+
],
123+
options={
124+
'ordering': ['index', 'id'],
125+
'verbose_name': '\u53cb\u60c5\u94fe\u63a5',
126+
'verbose_name_plural': '\u53cb\u60c5\u94fe\u63a5',
127+
},
128+
),
129+
migrations.CreateModel(
130+
name='Tag',
131+
fields=[
132+
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
133+
('name', models.CharField(max_length=30, verbose_name=b'\xe6\xa0\x87\xe7\xad\xbe\xe5\x90\x8d\xe7\xa7\xb0')),
134+
],
135+
options={
136+
'verbose_name': '\u6807\u7b7e',
137+
'verbose_name_plural': '\u6807\u7b7e',
138+
},
139+
),
140+
migrations.AddField(
141+
model_name='article',
142+
name='category',
143+
field=models.ForeignKey(verbose_name=b'\xe5\x88\x86\xe7\xb1\xbb', blank=True, to='blog.Category', null=True),
144+
),
145+
migrations.AddField(
146+
model_name='article',
147+
name='tag',
148+
field=models.ManyToManyField(to='blog.Tag', verbose_name=b'\xe6\xa0\x87\xe7\xad\xbe'),
149+
),
150+
migrations.AddField(
151+
model_name='article',
152+
name='user',
153+
field=models.ForeignKey(verbose_name=b'\xe7\x94\xa8\xe6\x88\xb7', to=settings.AUTH_USER_MODEL),
154+
),
155+
]
Binary file not shown.

Django/Django_blog/step3/blog/migrations/__init__.py

Whitespace-only changes.
Binary file not shown.
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# coding: utf-8
2+
# author: spareribs
3+
4+
5+
from django.db import models
6+
7+
from django.contrib.auth.models import AbstractUser
8+
9+
10+
# Create your models here.
11+
12+
'''
13+
############ 本地模型用到的字段类型和和参数的含义
14+
15+
max_length:最大长度
16+
blank:True可以为空
17+
null:可以为null
18+
verbose_name:admin显示名称
19+
default:默认值
20+
unique:True表示唯一
21+
【ImageField】:upload_to表示MEDIA_ROOT的子目录,用来存放上传的文件
22+
【CharField】
23+
【URLField】
24+
【IntegerField】
25+
【DateTimeField】:auto_now_add表示自动设置当前时间
26+
【TextField】
27+
【BooleanField】
28+
【EmailField】
29+
'''
30+
# 用户(User)模型
31+
# 采用的继承方式扩展用户信息
32+
class User(AbstractUser):
33+
# 在继承的基础上新增4个字段
34+
avatar = models.ImageField(upload_to='avatar/%Y/%m', default='avatar/default.png', max_length=200, blank=True,
35+
null=True, verbose_name='用户头像')
36+
qq = models.CharField(max_length=20, blank=True, null=True, verbose_name='QQ号码')
37+
mobile = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name='手机号码')
38+
url = models.URLField(max_length=100, blank=True, null=True, verbose_name='个人网页地址')
39+
40+
# 使用内部的class Meta 定义模型的元数据
41+
class Meta:
42+
# verbose_name:数据库表名名称,这里表名称为“用户”
43+
verbose_name = '用户'
44+
# verbose_name_plural:人类可读的单复数名称,这里“用户”复数名称为“用户”
45+
verbose_name_plural = verbose_name
46+
# ordering:如排序选项,这里以id降序来排序
47+
ordering = ['-id']
48+
49+
# 对象的字符串表达式(unicode格式)
50+
def __unicode__(self):
51+
return self.username
52+
53+
54+
# 标签(tag)模型
55+
class Tag(models.Model):
56+
name = models.CharField(max_length=30, verbose_name='标签名称')
57+
58+
class Meta:
59+
verbose_name = '标签'
60+
verbose_name_plural = verbose_name
61+
62+
def __unicode__(self):
63+
return self.name
64+
65+
66+
# 分类(category)模型
67+
class Category(models.Model):
68+
name = models.CharField(max_length=30, verbose_name='分类名称')
69+
index = models.IntegerField(default=999, verbose_name='分类的排序')
70+
71+
class Meta:
72+
verbose_name = '分类'
73+
verbose_name_plural = verbose_name
74+
ordering = ['index', 'id']
75+
76+
def __unicode__(self):
77+
return self.name
78+
79+
80+
# 自定义一个文章Model的管理器
81+
# 1、新加一个数据处理的方法
82+
# 2、改变原有的queryset
83+
class ArticleManager(models.Manager):
84+
def distinct_date(self):
85+
distinct_date_list = []
86+
date_list = self.values('date_publish')
87+
for date in date_list:
88+
date = date['date_publish'].strftime('%Y/%m文章存档')
89+
if date not in distinct_date_list:
90+
distinct_date_list.append(date)
91+
return distinct_date_list
92+
93+
94+
# 文章(aticle)模型
95+
class Article(models.Model):
96+
title = models.CharField(max_length=50, verbose_name='文章标题')
97+
desc = models.CharField(max_length=50, verbose_name='文章描述')
98+
content = models.TextField(verbose_name='文章内容')
99+
click_count = models.IntegerField(default=0, verbose_name='点击次数')
100+
is_recommend = models.BooleanField(default=False, verbose_name='是否推荐')
101+
date_publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
102+
103+
#
104+
user = models.ForeignKey(User, verbose_name='用户')
105+
category = models.ForeignKey(Category, blank=True, null=True, verbose_name='分类')
106+
tag = models.ManyToManyField(Tag, verbose_name='标签')
107+
108+
objects = ArticleManager()
109+
110+
class Meta:
111+
verbose_name = '文章'
112+
verbose_name_plural = verbose_name
113+
ordering = ['-date_publish']
114+
115+
def __unicode__(self):
116+
return self.title
117+
118+
119+
# 评论(comment)模型
120+
class Comment(models.Model):
121+
content = models.TextField(verbose_name='评论内容')
122+
username = models.CharField(max_length=30, blank=True, null=True, verbose_name='用户名')
123+
email = models.EmailField(max_length=50, blank=True, null=True, verbose_name='邮箱地址')
124+
url = models.URLField(max_length=100, blank=True, null=True, verbose_name='个人网页地址')
125+
date_publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
126+
#
127+
user = models.ForeignKey(User, blank=True, null=True, verbose_name='用户')
128+
article = models.ForeignKey(Article, blank=True, null=True, verbose_name='文章')
129+
pid = models.ForeignKey('self', blank=True, null=True, verbose_name='父级评论')
130+
131+
class Meta:
132+
verbose_name = '评论'
133+
verbose_name_plural = verbose_name
134+
135+
def __unicode__(self):
136+
return str(self.id)
137+
138+
139+
# 友情链接(links)模型
140+
class Links(models.Model):
141+
title = models.CharField(max_length=50, verbose_name='标题')
142+
description = models.CharField(max_length=200, verbose_name='友情链接描述')
143+
callback_url = models.URLField(verbose_name='url地址')
144+
date_publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
145+
index = models.IntegerField(default=999, verbose_name='排列顺序(从小到大)')
146+
147+
class Meta:
148+
verbose_name = '友情链接'
149+
verbose_name_plural = verbose_name
150+
ordering = ['index', 'id']
151+
152+
def __unicode__(self):
153+
return self.title
154+
155+
156+
# 广告(ad)模型
157+
class Ad(models.Model):
158+
title = models.CharField(max_length=50, verbose_name='广告标题')
159+
description = models.CharField(max_length=200, verbose_name='广告描述')
160+
image_url = models.ImageField(upload_to='ad/%Y/%m', verbose_name='图片路径')
161+
callback_url = models.URLField(null=True, blank=True, verbose_name='回调url')
162+
date_publish = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
163+
index = models.IntegerField(default=999, verbose_name='排列顺序(从小到大)')
164+
165+
class Meta:
166+
verbose_name = u'广告'
167+
verbose_name_plural = verbose_name
168+
ordering = ['index', 'id']
169+
170+
def __unicode__(self):
171+
return self.title
7.69 KB
Binary file not shown.

0 commit comments

Comments
 (0)