INSTALLED_APPS
中加入crispy_forms
?
django-crispy-forms
是对django form
在html
页面呈现方式进行管理的一个第三方插件。为什么有时候定义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至数据库时就会生成一个引用自己的外键
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()
为什么在创建model类时要嵌套一个meta类?
注意:关于设置字段时的一些值的含义
IntegerFiled不需要设置最大长度的,否则会抛一个警告
help_text表示的是帮助文档
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()
'''
等会整理:
原文:https://www.cnblogs.com/michealjy/p/11710592.html