怎样设计网站,网站统计查询,网站页面设计内容,房地产信息网查询系统一、model 文件中的类的建立#xff1a;
对应的是数据库中的每个表#xff0c;类中有什么字段#xff0c;表就会对应的生成某个字段#xff0c;主键id字段会自己生成#xff1b;
数据库中的文件获取#xff1a;只能通过模型类.objects来获取#xff0c;不能通过模型类…一、model 文件中的类的建立
对应的是数据库中的每个表类中有什么字段表就会对应的生成某个字段主键id字段会自己生成
数据库中的文件获取只能通过模型类.objects来获取不能通过模型类的实例获取
对model中的代码进行增删改先执行python manage.py makemigrations让修改动作保存到记录文件中然后进行python manage.py migrate 让实际的操作应用到数据库中。 还有隐藏字段_state 详情见https://www.liujiangblog.com/course/django/95第一章模型和字段
__str__方法用于返回实例对象的打印字符串 get_abosolute_url()方法返回每个模型实例的相应的访问url hash()方法给模型实例提供唯一的哈希值一旦生成就不允许修改
字段名不能用pass两个下划线下划线结尾
二、常用的Filed字段
BooleanField布尔类型默认值时None表单标签是checkboxinput如果设置参数nullTrue,则表现为NullBooleanSelect选择框
CharField字符串类型必须接收一个max_length参数表单标签是text input DateField日期类型两个重要参数参数互斥不能共存 auto_now:每当对象被保存时将字段设为当前日期常用于保存最后修改时间。auto_now_add每当对象被创建时设为当前日期常用于保存创建日期(注意它是不可修改的)。设置上面两个参数就相当于给field添加了editableFalse和blankTrue属性。如果想具有修改属性请用default参数。例子pub_time models.DateField(auto_now_addTrue)自动添加发布时间。表单标签是DateInput
DateTimeField比上一个多了小时分秒的显示 DecimalField固定精度的十进制小数。相当于Python的Decimal实例必须提供两个指定的参数参数max_digits最大的位数必须大于或等于小数点位数 。decimal_places小数点位数精度。 当localizeFalse时表单标签是NumberInput否则是textInput类型。例子储存最大不超过999带有2位小数位精度的数定义如下models.DecimalField(…, max_digits5, decimal_places2) EmailField邮箱类型默认max_length最大长度254位。使用这个字段的好处是可以使用Django内置的EmailValidator进行邮箱格式合法性验证
FileField上传文件字段不能设置主键表单标签是ClearableFileInput标签class FileField(upload_toNone, max_length100, **options)upload_to用于设置上传地址的目录和文件名也可以接收一个回调函数该函数返回具体的路径字符串。回调函数中包含了instance参数和filename参数
FilePathFieldclass FilePathField(path‘’, matchNone, recursiveFalse, allow_filesTrue, allow_foldersFalse, max_length100, **options)用来保存文件路径信息的字段
ImageFieldImageField(upload_toNone, height_fieldNone, width_fieldNone, max_length100, **options)同上需提前安装pillow模块这两个也需要在配置文件中配置MEDIA_ROOT上传文件在服务器的基本路径和MEDIA_URL指向上传文件的基本路径假设你有一个ImageField字段名叫mug_shot那么在Django模板的HTML文件中可以使用{{ object.mug_shot.url/size/name }}来获取该文件。其中的object用你具体的对象名称代替。
IntegerField整数类型表单标签是NumberInput或者TextInput GenericIPAddressFieldclass GenericIPAddressField(protocol‘both’, unpack_ipv4False, **options),IPV4或者IPV6地址字符串形式例如192.0.2.30或者2a02:42fe::4。在HTML中表现为TextInput标签。参数protocol默认值为‘both’可选‘IPv4’或者‘IPv6’表示你的IP地址类型。
TextField用于储存大量的文本内容表单标签是textarea URLField一个用于保存URL地址的字符串类型默认最大长度200 UUIDField用于保存通用唯一识别码Universally Unique Identifier的字段。注意不要写成defaultuuid.uuid4()。
三、关系类型字段
外键要放在‘多’的一方对于关系字段第一位置参数永远是关系对象不能是verbose_name 多对一ForeignKey 其中on_delete后的参数 ● CASCADE模拟SQL语言中的ON DELETE CASCADE约束将定义有外键的模型对象同时删除 ● 还有其他的参数详情见https://www.liujiangblog.com/course/django/96第一章关系字段 其中还有limit_choices_to等其他参数详情见同上
多对多ManyToManyField只能选择一个模型设置该字段 里面有through参数定义在 class Person(models.Model): name models.CharField(max_length50) class Group(models.Model): name models.CharField(max_length128) members models.ManyToManyField(Person, through‘Membership’, ## 自定义中间表 through_fields(‘group’, ‘person’), ) class Membership(models.Model): # 这就是具体的中间表模型 group models.ForeignKey(Group, on_deletemodels.CASCADE) person models.ForeignKey(Person, on_deletemodels.CASCADE) inviter models.ForeignKey(Person,on_deletemodels.CASCADE,related_name“membership_invites”, ) invite_reason models.CharField(max_length64) 定义了一个新的模型用来保存Person和Group模型的多对多关系并且同时增加了‘邀请人’和‘邀请原因’的字段。而且必须显式的指定through_fields参数用于定义关系。through_fields参数指定从中间表模型Membership中选择哪两个字段作为关系连接字段。 一对一OneToOneField
四、创建表的时侯的模型元数据class Meta:
其下面的主要字段 db_table指定在数据库中当前模型生成的数据表的表名 ordering排序加‘-’表示降序排列不加则表示升序排列可以在其后面再加字段对什么进行排序 idexes接收一个应用在当前模型上的索引列表models.Index(fields[‘last_name’, ‘first_name’]) verbose_name设置模型对象的名称。
五、模型的继承
1、想让抽象基类的子模型成为一个抽象基类那必须显式的在该子模型的Meta中同样声明一个abstractTrue 2、在多表继承中如不想让子类继承父类的ordering和get_latest_by参数就必须在子类中显示的指出或重写 3、声明一个代理模型只需在Meta中proxy的值设为True。
六、model的查询操作
1、创建对象模型类的实例化构造然后save( )方法保存或者 类.objects.create( )方法创建 或者直接在模型类中增加create方法和自定义管理器并在其中添加创建对象的方法 2、修改对象并保存在其中千万不要忘记super().save( *args**kwargs)这行确保了Django源码中关于save方法的代码会依然被执行。只有执行save方法后才会将数据写入数据库。 3、F表达式entry Entry.objects.get(name‘刘江的博客’) entry.number_of_pingbacks F(‘number_of_pingbacks’) 1 entry.save() Django设计的这个F表达式在获取关联字段值的时候不用先去数据库中取值然后在Python内存里计算而是直接在数据库中取值和计算直接更新数据库不需要在Python中操作自然就不存在数据竞争和冲突问题了。 4、希望结果是哪个模型的实例就用哪个模型去调用Blog.objects.xxx 5、QuerySet的切片 Entry.objects.all()[:5] # 返回前5个对象 Entry.objects.all()[5:10] # 返回第6个到第10个对象 注意不支持负索引例如 Entry.objects.all()[-1]是不允许的 指定步长的时候查询操作会立刻在数据库内执行 Entry.objects.all()[:10:2] 6、字段查询键名__字段指定的内容 字段有regex区分大小写的正则表达式匹配iregex不区分大小写。。。等字段 7、Q对象 可以使用或者|或~来组合Q对象分别表示与、或、非逻辑。它将返回一个新的Q对象。 Q(question__startswith‘Who’)|Q(question__startswith‘What’) 这相当于WHERE question LIKE ‘Who%’ OR question LIKE ‘What%’ 8、判断基于以下逻辑 ● 同一模型下主键相等则实例相等 ● 主键为None时和任何实例都不相等 ● 实例等于自己本身 ● 代理模型的实例等于相同主键的父类实例 ● 多表继承时哪怕主键值相等实例也不相等
七、不返回QuerySet的API
get() 获取单个对象注意其查询的对象只能有一个不然就报错 create() 创建对象无需save()同时创建并且保存对象的方法 get_or_create() 查询对象如果没有找到就新建对象建议只在post请求中这样使用不然不安全 update_or_create() 更新对象如果没有找到就创建对象 count() 统计对象的个数永远不会引发异常 latest() 获取最近的对象其本质就是先排序然后获取最前面的那个对象 earliest() 获取最早的对象获取最早先的对象 first() 获取第一个对象返回结果集的第一个对象当没有找到好似就返回None; last() 获取最后一个对象,返回结果集的最后一个对象 aggregate() 聚合操作见后面的章节 exists() 判断queryset中是否有对象查询其在不在 update() 更新对象对指定的字段执行更新操作并返回匹配行数 delete() 删除对象
八、注解与聚合
● aggregate: [ˈæɡrɪɡət ] 聚合。做一些统计方面的工作。返回的是聚合后的数据字典 ● annotate: [ˈænəteɪt]注解。为返回的查询集添加一些额外的数据。返回的依然是查询集。 其中的Avg,Sum,Count,Max,Min等其他的聚合函数。