增删改查(班级学生表)

题目

  • 模型类
    • 班级:班级名、人数
    • 学生:姓名、年龄、头像、所属班级
  • 功能
    • 班级添加
    • 学生添加,外键需要下拉框实现
    • 展示所有班级
    • 点击班级,跳转到学生列表页面(路由跳转时,需要传递 班级id 作为参数)
    • 展示该班级的所有学生
    • 点击学生,跳转到学生详情页面(路由跳转时,需要传递 学生id 作为参数)
    • 在每个学生后面显示一个 删除按钮, 点击按钮,删除当前学生
    • 在每个学生前面显示一个 复选框, 点击批量删除, 删除所有选中的学生

步骤

django

准备工作

创建项目

 django-admin startproject school

在项目中,创建APP,最后:项目包含app

cd school  # 进入项目中
python manage.py startapp student  # 创建app

如果项目无法运行,一般是解释器配置错误

  • 点击 file—> settings, 打开配置菜单
  • 在菜单中,点击 project:项目名,当前项目为school, 因此,点击 project:school
  • 点击第一个选项:python Interpreter,选择对应的解释器即可

修改配置项

修改 settings.py 文件

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'corsheaders',  # 跨域
    'rest_framework',  # drf框架
    'student' # 自己的APP
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',  # 添加跨域中间件
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',  # 关闭csrf验证中间件
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True  # 允许所有源访问


# 修改数据库链接配置为 mysql, 需要提前在mysql中创建好database
# create database school charset=utf8;
DATABASES = {
   
    'default': {
   
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'school',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': 'mysql'
    }
}

# 图片上传与展示
MEDIA_URL = 'media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 需要提前在项目中,创建好 media目录

如果项目运行,报错: WSGI application 'school.wsgi.application',一般是 添加的跨域中间件有错:

  • 单词拼错了
  • 逗号没写

修改主路由

school/urls.py

为了上传的图片可以正常展示,需要在主路由中做路由映射

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
  path('admin/', admin.site.urls),
  path('', include('student.urls')),  # 主路由包含子路由,实现路由分发
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

模型类

student/models.py

# 班级:班级名、人数
class Cls(models.Model):
    name = models.CharField(max_length=10, verbose_name='班级名')
    number = models.IntegerField(default=0, verbose_name='人数')


# 学生:姓名、年龄、头像、所属班级
class Student(models.Model):
    name = models.CharField(max_length=20, verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄')
    img = models.ImageField(upload_to='imgs/%Y/%m/%d', verbose_name='头像')
    cls = models.ForeignKey(to=Cls, on_delete=models.CASCADE, verbose_name='班级')
    # cls属性代表班级对象,包含班级的所有数据:班级名、班级人数
python manage.py makemigrations  # 生成迁移文件
python manage.py migrate # 生成表

后期在视图操作过程中,报错: no such table

  • 绝对没有迁移生成表
# 查询分类id为1 的所有商品
goods_set = Goods.objects.filter(cate_id=1)  # 在商品表中,通过外键查询


cate = Cate.objects.get(id=1)  # 在分类表中,通过主键直接查询id为1 的分类对象
# 通过分类对象查询商品。 属于反向查询
cate.goods_set.all()   # 通过django内置的方式 , 模型类_set实现反向查询 

goods_set = cate.goods_list.all() # 通过外键的related_name属性实现反向查询, 也就是通过分类对象查询对应的商品

序列化器

需要在app中创建自己的序列化文件,如student/serializers.py

from rest_framework.serializers import ModelSerializer
from student.models import *


class ClsModelSerializer(ModelSerializer):
    class Meta:
        model = Cls
        fields = '__all__'


class StudentModelSerializer(ModelSerializer):
    class Meta:
        model = Student
        fields = '__all__'  

报错: AttributeError: 'str' object has no attribute 'values'

  • 序列化器中没有写 class Meta

视图

添加班级 POST cls/ form-data

查询所有班级 GET cls/

class ClsAPIView(APIView):
    def post(self, request):
        # 1. 获取参数
        data = request.data
        # 2. 创建序列化器对象,添加数据
        ser = ClsModelSerializer(data=data)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值