python_web学习笔记四:django基础篇之数据库

一、模型定义

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参数选项

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(**data)
        # book.save()
        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,
        })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值