一、模型定义
1.字段类型
类型 | 说明 |
---|
AutoField | 自动增长的IntegerField |
BooleanField | 布尔字段 |
NullBooleanField | 支持Null、True、False三种值 |
CharField | 字符串,max_length表示最大字符个数 |
TextField | 大文本字段 |
IntegerField | 整数 |
DecimalField | 十进制浮点数, max_digits表示总位数, 参数decimal_places表示小数位数 |
FloatField | 浮点数 |
DateField | 日期, auto_now表示每次保存对象时,自动设置该字段为当前时间,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误 |
TimeField | 时间 |
DateTimeField | 日期时间 |
FileField | 上传文件字段 |
ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
2.选项
选项 | 说明 |
---|
null | 如果为True,表示允许为空,默认值是False |
blank | 如果为True,则该字段允许为空白,默认值是False |
db_column | 字段的名称,如果未指定,则使用属性的名称 |
db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False |
default | 默认 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用 |
unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False |
3.外键
ForeignKey(参数)
on_delete = models.参数
参数 | 说明 |
---|
CASCADE | 删除主表数据时连通一起删除外键表中数据 |
PROTECT | 通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据 |
SET_NULL | 设置为NULL,仅在该字段null=True允许为null时可用 |
SET_DEFAULT | 设置为默认值,仅在该字段设置了默认值时可用 |
SET() | 设置为特定值或者调用特定方法 |
4.定义示例
class Book(models.Model):
title = models.CharField(max_length=20, verbose_name="名称")
pub_date = models.DateField(verbose_name="发布日期")
read = models.IntegerField(default=0, verbose_name="阅读量")
comment = models.IntegerField(default=0, verbose_name="评论量")
is_delete = models.BooleanField(default=0, verbose_name="逻辑删除")
class Meta:
db_table = "tb_books"
verbose_name = "图书"
verbose_name_plural = verbose_name
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.title
class Hero(models.Model):
GENDER_CHOICES = (
(0, "女"),
(1, "男")
)
name = models.CharField(max_length=20, verbose_name="名称")
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name="性别")
comment = models.ForeignKey(Book, on_delete=models.CASCADE, verbose_name="图书")
is_delete = models.BooleanField(default=False, verbose_name="逻辑删除")
class Meta:
db_table = "tb_heros"
verbose_name = "英雄"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
5.迁移
python manage.py makemigrations
python manage.py migrate
二、增删改查示例
1.增加图书
视图
class BooksView(View):
def get(self, request):
pass
def post(self, request):
"""增加图书"""
data = json.loads(request.body.decode())
title = data.get("title")
pub_date = data.get("pub_date")
try:
book = Book.objects.get(title=title)
return JsonResponse({"error": "该书已存在"})
except:
pass
if not all([title, pub_date]):
return JsonResponse({"error": "数据不全"}, status=400)
if len(title) > 20:
return JsonResponse({"error": "title长度不得大于20"}, status=400)
Book.objects.create(**data)
book = Book.objects.get(title=title)
return JsonResponse({
"id": book.id,
"title": book.title,
"pub_date": book.pub_date,
"read": book.read,
"comment": book.comment,
})
请求示例
# post方式
{
"title": "西游记",
"pub_date": "1992-2-22"
}
2.查询所有图书
class BooksView(View):
def get(self, request):
books = Book.objects.all()
book_list = []
for book in books:
if book.is_delete:
continue
book_list.append({
"title": book.title,
"pub_date": book.pub_date,
"read": book.read,
"comment": book.comment,
})
return JsonResponse(book_list, safe=False)
3.查询单个图书
路由
url(r'^books/(?P<pk>\d+)/$', views.BookView.as_view()),
视图
class BookView(View):
def get(self, request, pk):
try:
book = Book.objects.get(id=pk)
except:
return JsonResponse({"error": "图书不存在"}, status=400)
return JsonResponse({
"id": book.id,
"title": book.title,
"pub_date": book.pub_date,
"read": book.read,
"comment": book.comment,
})
4.删除图书
class BookView(View):
def delete(self, request, pk):
try:
book = Book.objects.get(id=pk)
except:
return JsonResponse({"error": "图书不存在"}, status=400)
book.delete()
return JsonResponse({})
5.修改图书
class BookView(View):
def put(self, request, pk):
"""修改指定图书"""
try:
book = Book.objects.get(id=pk)
except:
return JsonResponse({"error": "图书不存在"}, status=400)
data = json.loads(request.body.decode())
title = data.get("title")
if len(title) > 20:
return JsonResponse({"error": "title长度不得大于20"}, status=400)
Book.objects.filter(id=pk).update(**data)
book = Book.objects.get(id=pk)
return JsonResponse({
"id": book.id,
"title": book.title,
"pub_date": book.pub_date,
"read": book.read,
"comment": book.comment,
})