zoukankan      html  css  js  c++  java
  • 生鲜超市项目错误及解决办法(crispy_forms、外键指向自己、class嵌套访问父类、meta类及各种字段参数)

    1. 为什么要在INSTALLED_APPS中加入crispy_forms

      • 因为django-crispy-forms 是对django formhtml页面呈现方式进行管理的一个第三方插件。
    2. 为什么有时候定义model时,会将外键设置成指向自己?

      • 比如有这种需求,一个商品类目(GoodsCategory)的Model,它有一个字段是父级目录(parent_category),父级目录应该是一个外键并引用GoodsCategory, 即

        class GoodsCategory(models.Model):
            """
            some other filed
            """
            parent_category = models.ForeignKey(GoodsCategory)
        

        显然,这样会报错,因为定义parent_category的时候,GoodsCategory还没有定义,不过不用担心,django已经有了解决措施,只需要在定义时将ForeignKey所引用的Model改为‘self’即可,即

        class GoodsCategory(models.Model):
            """
            some other filed
            """
            parent_category = models.ForeignKey("self")
        

        这样在同步models至数据库时就会生成一个引用自己的外键

        本答案参考这篇文章Django Model的外键自关联‘self’和设置‘unique_together’

    3. python class嵌套怎么访问父类?

      • 例如:

        class parent:
            def __init__(self):
                self.name = 'parent'
               
            def getName(self):
                print(self.name)
            
            class child:
                def getName(self):
                    #如何访问父类的name值
                    
        if __name__ == '__main__':
            child = parent.child()
            child.getName()
        
      • 答:由于parent.name在parent实例化之前不存在,所以child没办法访问到parent.name,有两种办法:

        ## 方法一:
        
        class parent:
            name = 'parent'
        	
            def getName(self):
                print(self.name)
        	class child:
                def getName(self):
                    return parent.name
                
        if __name__ == "__main__":
            child = parent.child()
            child.getName()
            
            
        ## 方法二:
        
        class parent:
            def __init__(self):
                self.name = 'parent'
        	
            def getName(self):
                print(self.name)
        	
            class child:
                def __init__(self.parent):
                    self.parent = parent
        		
                def getName(self):
                    return self.parent.name
        
        if __name_- == '__main__':
            parent = parent()
        	child = parent.child(parent)
            child.getName()
                
        
                
        	
        
    4. 为什么在创建model类时要嵌套一个meta类?

      • 第一个就是在商品类目里面设置了一个verbose_name=‘商品类别’,verbose_name_plural = verbose_name
        • 其实第一个等号的意思,就是给你的模型类起一个更可读的名字,在这里就是给GoodsCategory起一个名字叫 商品类别;
        • 第二个等号的意思是把 verbose_name指定为复数形式,如果不指定,则Django会自动在模型名称后面加上一个‘s’
        • 其实就是为了干预数据库建表名等操作,因为数据库中生成的表名称是 app名称 + 下划线 + 类名 ,有可能与数据库中的真正表名不一样,就会出现找不到表名的错误。

      注意:关于设置字段时的一些值的含义

      • IntegerFiled不需要设置最大长度的,否则会抛一个警告

      • help_text表示的是帮助文档

      • 外键约束中,on_delete = models.CASCADE,表示被外键约束的表,那么主表每个字段删除,相应受牵连的表的字段也会被删除

      • related_name = $$ 这个设置的是在一对多查询,进行反向查询时采用的语法结构,举个例子:

        我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型。
        
        class Person(models.Model):
            name = models.CharField(verbose_name='作者姓名',max_length=10)
            age = models.IntegerField(verbose_name='作者年龄')
            
        class Book(models.Model):
            person = models.ForeignKey(Person, related_name='person_book')
            title = models.CharField(verbose_name='书籍名称', max_length=10)
            pubtime = models.DateField(verbose_name='出版时间')
            
        ## 我们有一个需求,就是想查询一个作者出版了哪些书籍
        
        #有两种方式可以实现
        '''
        方式一:
        	先查询到作者的信息
            person = Person.objects.fiter(你的条件)
            返回一个person对象
            接下来就查询person关联的所有书籍对象,可以使用基于对象的查询方式,反向查询按照表名
        	book = person.book_set.all()
        	django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。
            这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。
        
        
        
        方式二:
        	上述可能比较麻烦
        	可以在定义主表的外键的时候,给这个外键定义好一个名称。要用related_name比如在Book表中:
          	person = models.ForeignKey(
          				Person,related_name='person_books')
        那么实现上面的需求,可以使用person.book_set.all()
        	也可以使用person.person_books.all()
        '''
        

    等会整理:

    [python-django 模型model字段类型说明]

    models字段含义与用法

    django模型内部类meta详解

  • 相关阅读:
    弹出框背景色透明滚动条滚动仍然居中
    日常css和js小知识点记录
    手机端上传未知图片大小,js设置宽高比例
    IE6兼容透明背景图
    css考核点整理(七)-css sprites技术的使用心得
    css考核点整理(六)-水平居中定位的几种方式
    css考核点整理(五)-css3新增的常用属性
    css考核点整理(四)-css盒模型
    css考核点整理(三)-css选择器的使用
    css考核点整理(二)-css层叠机制
  • 原文地址:https://www.cnblogs.com/michealjy/p/11710592.html
Copyright © 2011-2022 走看看