zoukankan      html  css  js  c++  java
  • python-day75--django项目问题详细

    1.项目名要小写

    2.表中字段

      AutoField()   表示整形字段,建表时不用写,当整形的数字范围不够你用的时候, 你可以用 BigAutoField()字段, 表示长整形

        当表内新增有关联关系的字段时,如字段设置默认值会报错,因为对应的表中没有数据,故设置 null=True

    3.在视图函数中进行逻辑判断时:简单的逻辑要放在上面

    4.在一张表中对多个其他表做FK,M2M时,就要使用 related_name , 否则当其他表的对象反向查询时会不知道找的是哪个字段

    5.在一对一的关系中,想要修改一个对象对应的另外一张表中的数据时,首先通过这个对象找到与另外那张表的建立关系的字段,然后在另外那张表中通过这个字段值 filter 出一个QuerySet,再用update方法修改

    6.一定要注释,养成习惯

    7.对数据库操作时,如果是跨表操作会有性能损耗,所以在一些情况下设计表时可以进行优化  --      choices方法

          - 方法一  多对一:
                    class UserType(models.Model):
                        """
                        用户类型表,记录经常变动
                        """
                        title = models.CharField(max_length=32)
    
                    class UserInfo(models.Model):
                        """
                        用户表:讲师和班主任
                        """
                        username = models.CharField(max_length=32)
                        password = models.CharField(max_length=64)
                        email = models.CharField(max_length=32)
                        ut = models.ForeignKey(to="UserType")
    - 方法二 choices: class UserInfo(models.Model): """ 用户表 """ username = models.CharField(max_length=32) password = models.CharField(max_length=64) email = models.CharField(max_length=32) user_type_choices = ( #choices方法适用于记录不经常变动的 (1, '班主任'), (2, '讲师'), ) user_type_id = models.IntegerField(choices=user_type_choices)

    举例:

    多对一方法:      """
                    ID     Title
                     1      图片
                     2      挨踢1024
                     3      段子
                    """
                    class NewsType(models.Model):
                        title = models.CharField(max_length=32)
    """ ID Title Summary News_Type 1 t.... 科技... 2 2 t.... 科技... 1 3 t.... 科技... 2 """ class News(models.Model): title = models.CharField(max_length=32) summary = models.CharField(max_length=255) news_type = models.ForeignKey(to="NewsType") # 查看所有新闻 new_list = News.objects.all() for row in new_list: print(row.title,row.summary,row.news_type.title)
    choices方法:    """
                    ID   Title  Summary   News_Type
                    1    t....   科技...     2
                    2    t....   科技...     1
                    3    t....   科技...     2
    
                    """
                    class News(models.Model):
                        title = models.CharField(max_length=32)
                        summary = models.CharField(max_length=255)
    
                        news_type_chices = (
                            (1,'图片'),
                            (2,'挨踢1024'),
                            (3,'段子'),
                        )
                        news_type = models.IntegerField(choices=news_type_chices)
    
                    # 查看所有新闻
                    new_list = News.objects.all()
                    for row in new_list:
                        print(row.title,row.summary,  row.get_news_type_display()  )

    8. session 验证 + 装饰器 + settings 配置

    settings 配置  : 在 settings.py 中 自定义 SJF = "user_info"  ,注意变量名一定要大写。这样配置后 避免在修改 'user_info' 时 大量的在视图函数中修改,只要在配置文件中改一下就OK了

    session 操作 :

      1. 先引用  from django.conf import settings

      2.设值: request.session[settings.SJF] = {'id':user.id, 'username':user.username}

      3.取值: request.session[settings.SJF]  与 request.session.get(settings.SJF)  的区别, 前者取不到值会报错,而后者取不到会返回none

    session 装饰器:

    def auth(func):
        def inner(request,*args,**kwargs):
            user_info = request.session.get(settings.SJF)
            if not user_info:
                return redirect('/login/')
            return func(request,*args,**kwargs)
        return inner

     9.设计表时- 属性相同归类到一张表中  ,如: 讲师 与 班主任

    10.    uwsgi,wsgi什么区别?

            wsgi,    是web服务网关接口,是协议
            
            uwsgi    实现协议的模块
            wsgiref  实现协议的模块

     11.FK关系

    """
         id name
    1 n1 2 n2 3 n3 """ class A: name = xxx """
         id title xx_id
    1 uu1 2 2 uu2 2 """ class B: title = xxxx xx = FK() # 从B表开始查 data = models.B.objects.filter(title=xxx,xx_id=1,xx__name='xxx') data = models.B.objects.filter(**{"title":xxx,"xx_id":1,"xx__name":'xxx'}) data = models.B.objects.filter(title=xxx,xx_id=1,xx__name='xxx').values("title",'xx_id','xx__name') data = models.B.objects.filter(title=xxx,xx_id=1,xx__name='xxx').values_list("title",'xx_id','xx__name') data = models.B.objects.all() for item in data: item.tile item.xx.name # 从A表开始查 data = models.A.objects.all() for item in data: item.id,item.name, item.b_set.all() data = models.A.objects.filter() # 3条记录 data = models.A.objects.filter(b__id=2) #1 条记录 data = models.A.objects.filter(b__id=2).values('id','name','b__title') #1条记录 data = models.A.objects.values('id','name','b__title') #4 条记录 !!!!!注意 1 n1 None 2 n2 uu1 2 n2 uu2 3 n3 None

     12、如果获取的数据不是直接可以展示的结构

    延迟视图函数的数据处理,只有当前端用值的时候才进行处理,性能优化
    
    #方式一:利用类、__iter__、yield实现
    class Foo(object):
      def __init__(self,data):
        self.data = data
    
      def __iter__(self):
        for item in self.data:
          yield item
    
    def test(request):
      user_list = [
        {'id':1,'name':'alex','age':19},
        {'id':2,'name':'eric','age':18},
        ]
      obj = Foo(user_list)
      return render(request,'test.html',{'user_list':obj})
    
    
    #方式二:利用生成器函数 --只有当前端用到'user_list'的时候才执行
    def test(request):
      user_list = [
        {'id':1,'name':'alex','age':19},
        {'id':2,'name':'eric','age':18},
        ]
    def inner(arg):
      for item in arg:
        yield {"id":item['id'],"name":item['name'],"age":item['age']}
    
    return render(request,'test.html',{'user_list':inner(user_list)})
  • 相关阅读:
    python字符串操作
    老男孩购物车程序
    python数据类型,判断,循环
    Matplotlib 绘图参考手册
    numpy 基础知识
    numpy random 模块
    numpy 算术运算
    pandas 读写数据
    python 读写文本
    python--windows文件操作
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7780361.html
Copyright © 2011-2022 走看看