Django项目之模型
- 创建环境
 - 配置连接MySQL数据库
 - 创建表单
 - 注册模型
 - Django模型类查询
 - 模型类的条件查询
 - 聚合函数
 
创建环境
创建Django项目,创建usersapp,并在setting.py中注册
- 项目工作目录

 
配置连接MySQL数据库
- 修改/Djweb/Djweb/setting.py中DATABASE设置
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'Djweb',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',
        'PORT': 3306
    }
}
 
并创建数据库
create database Djweb charset=utf8;
 
安装MySQL数据库依赖
>>pip install mysqlclient
Collecting mysqlclient
  Downloading mysqlclient-2.2.0-cp310-cp310-win_amd64.whl (199 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 199.9/199.9 kB 168.6 kB/s eta 0:00:00
Installing collected packages: mysqlclient
Successfully installed mysqlclient-2.2.0
 
创建表单
/Djweb/news/models.py
from django.db import models
# Create your models here.
"""
新闻类型表:
    news_type表:
        id:主键
        name:类型名称
新闻信息表:
     news_info表:
        id:主键
        title:标题
        content:内容
        read:阅读数据
        comment:评论数量
数据表之间的关系:
    一对一:OneToOneField、一对一,将字段定义在任意一端中
    一对多:ForeignKey、一对多,将字段定义在多的一端中
    多对多:ManyToManyField、多对多,将字段定义在任意一端中。
"""
class NewsType(models.Model):
    name = models.CharField(max_length=30, verbose_name='新闻类型', help_text='名称')
class NewsInfo(models.Model):
    title = models.CharField(max_length=100, verbose_name='标题', help_text='标题')
    content = models.TextField(max_length=100, verbose_name='内容', help_text='内容')
    read = models.IntegerField(verbose_name='阅读量', help_text='阅读量')
    comment = models.IntegerField(verbose_name='评论量', help_text='评论量')
    type = models.ManyToManyField('NewsType', verbose_name='新闻类型', help_text='新闻类型')
 
进行迁移
python manage.py makemigrations
Migrations for 'news':
  news\migrations\0001_initial.py
    - Create model NewsType
    - Create model NewsInfo
 
生成到数据库表单
python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, news, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying news.0001_initial... OK
  Applying sessions.0001_initial... OK
 
此时数据库显示
 
- 自定义显示数据库表名
/Djweb/news/models.py 
class NewsType(models.Model):
    name = models.CharField(max_length=30, verbose_name='新闻类型', help_text='名称')
    class Meta:
        # 指定生成的表名
        db_table = 'type'
        # 说明信息,再Django后台显示
        verbose_name = '类型'
class NewsInfo(models.Model):
    title = models.CharField(max_length=100, verbose_name='标题', help_text='标题')
    content = models.TextField(max_length=100, verbose_name='内容', help_text='内容')
    read = models.IntegerField(verbose_name='阅读量', help_text='阅读量')
    comment = models.IntegerField(verbose_name='评论量', help_text='评论量')
    type = models.ManyToManyField('NewsType', verbose_name='新闻类型', help_text='新闻类型')
    class Meta:
        # 指定生成的表名
        db_table = 'news'
        # 说明信息,再Django后台显示
        verbose_name = '新闻'
 
重新生成迁移文件,并生成数据库表
 
注册模型
- /Djweb/news/admin.py
 
from django.contrib import admin
from .models import NewsInfo,NewsType
# Register your models here.
class NewsTypeAdmin(admin.ModelAdmin):
    list_display = ['id', 'name']
class NewsInfoAdmin(admin.ModelAdmin):
    list_display = ['id', 'title','content','read','comment']
admin.site.register(NewsInfo,NewsInfoAdmin)
admin.site.register(NewsType,NewsTypeAdmin)
 
- 在命令行注册admin管理员账号
 
python manage.py createsuperuser
 
访问网站admin后台
 
- 在类型页面与新闻页面构造测试数据

 - 修改显示数据


增加 str 方法 
class NewsType(models.Model):
    name = models.CharField(max_length=30, verbose_name='新闻类型', help_text='名称')
    class Meta:
        # 指定生成的表名
        db_table = 'type'
        # 说明信息,再Django后台显示
        verbose_name = '类型'
    def __str__(self):
        return self.name
 
Django模型类查询

 
 
 
模型类的条件查询

 
 
 
 
 
聚合函数

 

![[DASCTF 2023  0X401七月暑期挑战赛] REV1 controlflow复现](https://img-blog.csdnimg.cn/8caa349b0a3b44f2b326586e84ceea51.png)
















