欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python3之Django Web框架CMS总结

程序员文章站 2022-07-03 23:19:32
...

知识回顾:

表与表之间的关系:

    一对多:字段名 = models.ForeignKey('要关联的类名')
        1.字段名不需要加id,Django会自动帮忙加上;
        2.一对多中的‘一’代表主表,‘多’代表从表;
        3.建表时主表没有从表字段,页面显示通过外键去获取从表的值;
        4.正向查询:字段名=关联的类的对象,Django会自动为字段名查找相应的id,之所以可以这样,是因为字段名唯一指向一个对象。
        5.反向查询:要查询的对象集合 = 关联的类对象.类名_set.all(),要查询的数据是多个对象的QuerySet集合;

    多对多:字段名s = models.ManyToMany('被关联的类名')
        1.正向查询:
            要查询的对象集合 = 类对象.字段名s.all()
        2.反向查询:
            要查询的对象集合 = 被关联的类对象.类名_set.all()

    一对一:字段名 = models.OneToOne('被关联的类名')
        1.正向查询:
            被关联的类对象 = 关联的类对象.字段名

        2.反向查询:
            关联的类对象 = 被关联的类对象.关联的类名
            # 查询egon作者的手机号
            egon_obj = models.Author.objects.filter(name='egon').first()
            关联的类对象(属性) = 被关联的类对象.关联的类名
            tel_num = egon_obj.AuthorDetail.telphone

总结:

1. 正向查询直接找所定义的外键字段名;
2. 反向查询找对应的类名,如果是查询的结果只有一个,就直接''.类名'',多个就''类名_set.all()'';

关于CMS的几点感悟:

1.首先也是非常重要的一环就是要分析项目中的表,表字段,及表之间的关系,尤其是表的关系,最好找张纸罗列出所需要的字段和表之间的关系,一点点处理掉!!!
2.新知识要**先**回顾,不能冒进,上年纪了好多都是头天学的,第二天就忘记了,所以昨天写项目时费的时间要远远比总结先前的知识花费的时间要长很多,想想这只是对时间的浪费,1分钟能做出来的,因为对知识的遗忘,要花10分钟甚至更多的时间去思考;
3.界面的处理要提前设计好,能用继承的都用继承,避免重复的无效劳动;
4.上干货:
<input type="text" class="form-control" id="author-name" placeholder="请输入作者"
                       value="{% for book_author in  book_obj.author.all%}{{ book_author.aname }}{% endfor %}">
**居然有换行问题**,昨天做项目时发现,这样循环出来居然两个作者之间有很大的空隙,我以为循环错误~
5.name="book_price"不能命名为book-price,这样获取不到数据,这应该和pep8有一定啊,把python和html要用的变量名分清楚,处理好,可以有效的避免这种问题;
6.分清主表从表,添加数据好处理;
7.建项目时将所有的表罗列出:每个表的字段,表的关系理清楚;
8.models.类名.objects.create()创建出来的是一个对象,而其他的方法除了get()都是对象集合;
9.# 添加多个字段,通过对象.多对对字段名.add(字段名对应的对象)
    book_obj = models.Book.objects.filter(bid=book_id).first()
    book_obj.author.add(author_obj)
    一本书可以有多个作者,如果要更改update(),需要先.clear()一下再添加,防止追加;
10.//按钮可以使用a标签(BootStrap)
<a href="/CMS/editbook/{{ book.bid }}" class="btn btn-sm btn-info" role="button">编辑</a>
11.获取表单多个值是用request.POST.getlist('');
12.表之间是独立的,不能用关联字段给另外的表直接赋值;

11.更新数据库时最好用update,昨天碰到一个奇怪的问题,代码被删除了,好可惜没法重现,用对象.save()会出问题!