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)})
  • 相关阅读:
    图书管理系统---基于form组件和modelform改造添加和编辑
    Keepalived和Heartbeat
    SCAN IP 解释
    Configure Active DataGuard and DG BROKER
    Oracle 11gR2
    我在管理工作中積累的九種最重要的領導力 (李開復)
    公募基金公司超融合基础架构与同城灾备建设实践
    Oracle 11g RAC for LINUX rhel 6.X silent install(静默安装)
    11gR2 静默安装RAC 集群和数据库软件
    Setting Up Oracle GoldenGate 12
  • 原文地址:https://www.cnblogs.com/liuwei0824/p/7780361.html
Copyright © 2011-2022 走看看