Django笔记-Models总结

django foreignkey 中的 self 递归用法 <br />django 主键要与自己行成多对一的关系时可以用models.foreignkey('self'),如果直接存储会提示主键不存在,无法保存.<br />例如:我想做一个导航类,这些导航存储着自己的父节点,一开始写法为:<br />class Navi(models.Model): """ Navi has four type: goods, news, page and custom """ STYLE_CHOICES = ( ('go 阅读详情

models例子如下,本文主要针对该例子来描述
from django.db import models

# Create your models here.
class Publisher(models.Model):
 name = models.CharField(max_length = 30)
 address = models.CharField(max_length=50)
 city = models.CharField(max_length=60)
 state_province=models.CharField(max_length=30)
 country = models.CharField(max_length=50)
 website = models.URLField()
 
 def __unicode__(self):
  return "name:%s, address:%s" % (self.name, self.address)
 
class Author(models.Model):
 first_name = models.CharField(max_length = 30)
 last_name = models.CharField(max_length=40)
 email = models.EmailField(blank=True)
 
 def __unicode__(self):
  return self.last_name
 
class Book(models.Model):
 tille = models.CharField(max_length=100)
 authors = models.ManyToManyField(Author)
 publisher = models.ForeignKey(Publisher)
 publication_date = models.DateField()
 
 def __unicode__(self):
  return self.tille

     1.基本操作
from website.app import models

1)insert
p1 = models.Publisher(name='Apress', address='2855 Telegraph Avenue',
     city='Berkeley', state_province='CA', country='U.S.A.',
     website='http://www.apress.com/')
p1.save()

2)select
publisher_list = models.Publisher.objects.all()
publisher_No.1 = models.Publisher.objects.all()[0:2]

3)update
p = models.Publisher.objects.all()[0]#取出第一条记录的指针
p.name="hongxing"#将名字改为hongxing
p.save()#保存

4)filter
models.Publisher.objects.filter(name='hongxing')#单条件搜索
models.Publisher.objects.filter(name="chubanshe",city='beijing')#and条件
mdoels.Publisher.objects.filter(name='hognxing').update(city='zaozhuang')

5)like
models.Publisher.objects.filter(name__contains='hong')#所有名字中包含hong的记录

6)retrieving single objects
models.Publisher.objects.get(name="hongxing")

7)order
models.Publisher.objects.order_by('name')
models.Publisher.objects.order_by('name', 'city')
models.Publisher.objects.order_by('-name')#倒序

指定默认的排序方式:
class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    def __unicode__(self):
        return self.name
    
    class Meta:
     ordering=['name']
    
8)Chaining Lookups
mdoels.Publisher.objects.filter('name').order_by('city')

9)delete
models.Publisher.objects.get(name='hognxing').delete()

2.Foreign Key

1)ForeignKey用来定义多对一得关系,ForeignKey的参数是主键的类,就像文章开始
用的例子,Book.publisher的ForeignKey参数就是Publisher类。

2)对象也可以和自身关联,用mdels.ForeignKey('self'),这样就建立了一种递归关系。

3)在2)中用到了字符串,是的,外键参数可以用字符串的,这个在参数类还没有定义的时候
尤其适用,比如在Publisher类没有定义时,你完全可以用models.ForeignKey('Publisher')
注意:只能对同一个models.py文件中的模型适用字符串引用,其他的或者导入的模型不可用。

4)访问
在文章开始给出的models可以看出,Book中有外键publisher
如下代码所示,通过book的object访问publisher同访问正常field没区别。
但是通过主键Publisher访问book时,需要用book_set的形式。
即:主键中模型类名的小写+_set

>>> from website.books import models
>>> b = models.Book.objects.get(tille='djangobook')
>>> p=models.Publisher.objects.filter(name='Apress')[0]
>>> b.publisher
<Publisher: name:Apress, address:2855 Telegraph Avenue>
>>> p.book_set.all()
[<Book: djangobook>, <Book: pythonbook>]
 
    3.ManyToMany
1)ManyToManyField放在哪个模型中
分析文章开始给出的例子:一个作者可以写多本书,一本书可以有多本书
这个Field放在Book中还是Author中都可以。但是不能两个都放。

2)关于自关联以及字符串参数等同ForeignKey一样。

3)访问同ForeignKey类似
这里说明一点。book_set属性一定是author的一条记录而不能是QuerySet

正向访问:
>>> book = models.Book.objects.get(tille='djangobook')
>>> book.authors.all()
[<Author: yonggao>, <Author: xiuqi>]
反向访问:
>>> aut = models.Author.objects.filter(last_name__contains='yonggao')
>>> aut.book_set.all()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'book_set'
>>>
>>> aut = aut[0]
>>> aut.book_set.all()
[<Book: djangobook>, <Book: pythonbook>]
 
   4.修改数据库模型
创建好数据库后,如果在添加和删除列,python manage.py syncdb就不起作用了。
本节主要学些关于修改数据库列的知识。
1)django对models和database同步处理,这里直接引用原文更好些:
■Django will complain loudly if a model contains a field that has not yet been created in the 
database table. This will cause an error the first time you use the Django database API to query 
the given table (i.e., it will happen at code execution time, not at compilation time).
■Django does not care if a database table contains columns that are not defined in the model.
■Django does not care if a database contains a table that is not represented by a model.

2)变更字段
在添加字段时,可以现在models.py中添加上要添加的内容
然后通过python manage.py sqlall books来看books app中数据库创建
语句,这样根据sql语句,可以很轻松的使用alter命令来修改自己的数据库。

    5.Managers
Book.objects.all()中objetcs就是一个Manager的例子。那么什么时候需要
定制自己的manager呢: to add extra manager methods, and/or 
to modify the initial QuerySet the manager returns.

1)Adding Extra Manager Methods
例子:
给Book Model添加一个可以统计指定关键字个数的方法

class BookManager(models.Manager):
 def title_count(self,keyword):
  return self.filter(tille__icontains=keyword).count()

class Book(models.Model):
 tille = models.CharField(max_length=100)
 authors = models.ManyToManyField(Author)
 publisher = models.ForeignKey(Publisher)
 publication_date = models.DateField()
 objects = BookManager()
 
 def __unicode__(self):
  return self.tille
  
2)Modifying Initial Manager QuerySets
管理器默认的QuerySet返回表中的所有记录,如果有需要可以定制返回内容。
只需要重写Manager.get_query_set()就可以了。
举例:下面的model如果用dahl管理器则在使用Book.dahl_ojbects.all()时
只会返回所有yonggao写的书。

from django.db import models

# First, define the Manager subclass.
class DahlBookManager(models.Manager):
    def get_query_set(self):
        return super(DahlBookManager, self).get_query_set().filter(author='yonggao')

# Then hook it into the Book model explicitly.
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    # ...

    objects = models.Manager() # The default manager.
    dahl_objects = DahlBookManager() # The Dahl-specific manager.
    
上面例子的注意点:
当自己定义管理器时,请总要保留models.Manager()这个默认管理器。

自定义管理器可以用来定义共通的过滤器例如下面的例子,使用不同的
Manager来管理不同的数据更容易。

class MaleManager(models.Manager):
    def get_query_set(self):
        return super(MaleManager, self).get_query_set().filter(sex='M')

class FemaleManager(models.Manager):
    def get_query_set(self):
        return super(FemaleManager, self).get_query_set().filter(sex='F')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    sex = models.CharField(max_length=1, choices=(('M', 'Male'), ('F', 'Female')))
    people = models.Manager()
    men = MaleManager()
    women = FemaleManager()

一个注意点:如果在model中定义了多个manager,则第一个manager是django的默认
管理器。django的很多部分会用默认manager来处理model。

     6.Executing Raw SQL Queries
你可以再django使用标准的python数据库语句。

另外,推荐方法是将sql statemets放在model methods活manager methods中。
例子:
from django.db import connection, models

class PersonManager(models.Manager):
    def first_names(self, last_name):
        cursor = connection.cursor()
        cursor.execute("""
            SELECT DISTINCT first_name
            FROM people_person
            WHERE last_name = %s""", [last_name])
        return [row[0] for row in cursor.fetchone()]

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    objects = PersonManager()

Python后台开发——Django高级与项目实战 1 Cookie 1.1 Cookie机制 在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。 而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这 阅读详情

相关推荐

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析

本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。

weixin_29313423的博客 231

Django笔记-Models

models例子如下,本文主要针对该例子来描述from django.db import models# Create your models here.class Publisher(models.Model): name = models.CharField(max_length = 30) address = models.CharField(max_length=50) city =

Good good study! 8315

SpringCloud 2025王炸更新!GraalVM原生镜像启动速度提升90%实战

在当今云原生和Serverless架构盛行的时代,应用的启动速度已成为衡量技术栈竞争力的关键指标。传统SpringCloud应用由于依赖JVM的动态类加载、反射等机制,启动时间通常超过30秒,在Kubernetes滚动更新和函数计算场景下成为显著性能瓶颈。2025年,SpringCloud迎来里程碑式更新,通过深度集成GraalVM原生镜像技术,实现了启动速度提升90%的惊人突破,让SpringCloud应用正式进入"秒级启动"时代。

小筱在线博客 1098

Python-Django框架(四)

模型_02 一、关联关系 1、概述 关联关系指的是数据表之间的数据是相互依赖和影响关系,表之间有从属关系,比如,有一个用户表,用户又有订单表,则用户表与订单表之间就存在从属关系。 2、关联关系的种类 一对一 一个人一本护照 一对多 一个部门可以有多个员工 多对多 一个学生有多门课,一门课有多个学生 3、Model中的关联关系 3.1 关系类型字段 ForeignKey(to...

qq_44124656的博客 258

vins-mono保存、重载地图、evo工具测试

下面咱们来对vins-mono的重定位vins-mono官方源码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono https://blog.youkuaiyun.com/learning_tortosie/article/details/83182258 运行这条: roslaunch benchmark_publisher publish.launc...

追 1万+

Win11桌面图标小箭头去除与恢复:解决任务栏关联错误的完整指南

本文提供了一份完整的Win11桌面图标小箭头去除与恢复指南,重点解决了因错误方法导致的任务栏关联错误问题。通过分析注册表中IsShortcut键值与Shell Icons的原理,推荐安全的“替换图标资源法”,并提供了可一键执行的批处理脚本,确保在美化桌面的同时不影响系统功能与默认应用设置。

weixin_29288313的博客 941

ORM之聚合查询,分组查询,F查询,Q查询,ORM查询优化,事务操作,常见字段及参数,多对多三种表的创建

ORM之聚合查询,分组查询,F查询,Q查询,ORM查询优化,事务操作,常见字段及参数,多对多三种表的创建

Yydsaoligei的博客 1177

GPU服务器维修全流程:从检测到解锁

《GPU服务器维修维保全流程指南》摘要:本文系统介绍GPU服务器从检测到解锁的完整维修流程。检测环节包含物理检查(氧化层、散热、PCB板)和电子诊断(ECC报错率、电源波动等);核心维修技术涵盖PCB板修复(微孔镀铜、BGA返修)和芯片级维修(成功率78-92%);解锁验证阶段包括性能解锁(VBIOS重写)和72小时稳定性测试。文末提供故障速查表及维保建议,强调定期除尘可降低38%故障率,推荐环境粉尘浓度控制在≤0.3mg/m³。

2401_89353317的博客 889

Django搭建简单网页的学习笔记 之一(models)

一、创建一个django工程 选择一个工作目录,然后用下面命令行创建一个project      django-admin startproject mysite 创建后的目录如下所示: mysite/    manage.py    mysite/        __init__.py        settings.py

Jackie Lee的博客 1065

Panda3d 场景管理

许多简单的 3D 引擎维护一个 3D 模型列表,然后在每一帧对这些模型进行渲染。在这些简单的引擎中,必须分配一个3D模型(或从磁盘加载它),然后将其插入到要渲染的模型列表中。模型在插入到列表中之前对渲染器不“可见”。 Panda3D稍微复杂一些。它不是维护要呈现的对象列表,而是维护要呈现的对象树。对象在插入树之前对渲染器不可见。

u014077947的博客 1383

Python爬虫实战【房产刚需专属】:爬取链家/贝壳完整房源数据,精准筛选刚需房源【房价+户型+地段+面积+装修】

本次爬虫的核心亮点就是刚需专属筛选,我已经把刚需买房的主流筛选逻辑封装为独立函数,你只需要修改筛选参数,就能精准匹配你的需求无需懂Python语法,直接改数字/文字即可!本次爬虫是刚需买房+Python爬虫实战的完美结合。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1821

django中models阅读笔记

一、使用数据库需要设置settings.py文件。 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '', ...

diaolong123123的博客 94

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

django学习笔记之models

这里还需要安装 pymysql 并在根目录的 __init__.py 文件中导入如下。表如果声明错误的话需要先将models模型修改无误之后,再按照上面的步骤重新修改就可以了。此时也只是生成了一个脚本文件,并没有去同步到数据库中还需要再输入如下命令。接着打开pycharm的工具选项卡找到 运行manage.py。1.首先创建一个简单地models模型。运行完之后会生成一个如下文件。

weixin_46674296的博客 392

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

django models 文档笔记

1.modelsmodels是关于您的数据的单一,明确的信息来源。它包含您正在存储的数据的重要字段和行为。通常,每个模型映射到单个数据库表。每个模型都是一个子类的Python类 django.db.models.Model。模型的每个属性表示一个数据库字段。在代码层面,模型就是一个类,包含属性和方法。模型中最重要的部分 - 也是模型的唯一必需部分 - 是它定义的数据库字段的列表。字段由类属性指定。...

learnpy3的博客 268

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Django models笔记

models例子如下,本文主要针对该例子来描述 from django.db import models # Create your models here. class Publisher(models.Model):  name = models.CharField(max_length = 30)  address = models.CharField(max_length=5

Langley 765

Django学习笔记之——Models

Django里的模型是对数据库对表的一次封装,是应用业务与数据之间的桥梁。 1. 模型的Fields 在上一节,我们在mysite/blog/models.py中创建了BlogPost这个Model。 ? 1 2 3 4 5 from django.db import models

littleqqqqq的博客 378

Django创建博客笔记-Models

一.Django中的models是什么?    通常,一个model对应数据库的一张数据表。    django中的models以类的形式表现。在这个类里有一些基本的字段以及数据的一些行为。ORM-对象关系映射(Object Relation Mapping)    实现了对象和数据库之间的映射,隐藏了数据访问细节,不需要编写SQL语句。二.编写Models    步骤        1.在应用根...

tamakisakura 253

Django笔记(五):模型models

player.py每个模型需要继承models类,如上Player模型定义了一个整形字段idx。常见字段类型有:字段描述整形FloatField浮点型CharField字符串类型TextField长文本类型布尔类型参数取值描述nullTrue/False是否为空uniqueTrue/False字段是否唯一defaultauto字段默认值max_lengthint字段最大长度True/False是否为主键。

垃圾管理员的垃圾站 1216

django models索引_Django 开发学习笔记

点击上方“Python Web与Django大咖之路”关注我!小编我对Python Web开发和Django充满热情,专注于点点滴滴的技术总结文章和实战代码分享。如果聪明勤奋的你也对Python基础、Django后端、数据库知识、Linux使用、Nginx使用等领域感兴趣,欢迎关注我的微信公众号【Python Web与Django大咖之路】啊。每天学习进步一点点,静觅,静静寻觅生活的美...

weixin_35363895的博客 192

《Django3.0文档》笔记:Models

《Django文档3.0》笔记:Models 模型类 模型可以准确且唯一地描述数据,其包含了存储数据的重要字段。每个模型都是一个Python的类,这些模型类继承自django.db.models.Model,模型类的每个属性都相当于数据库表的一个字段。一般来说,每个模型类映射一张数据库表,每个模型类的实例代表数据库表的一行记录,每个字段映射为数据库表的一列。通过模型类和Django提供的一套数据库抽象API,可以创建、检索、更新和删除对象。 from django.db import models cl

weixin_42629358的博客 569

Django 速成笔记(2)--Django templates models 使用笔记

templates 模板中的变量及循环输出其它容器值 视图views.py def home(request): s = 'Hello World!' l = [1,2,3,4,5,6,7,8] info_dict = {'h': 'hello', 'w': 'worl...

chizhonger4327的博客 176

Tango with Django笔记——models、admin

1. python manage.py makemigrations &lt;app_name&gt;生成迁徙脚本 python manage.py migrate进行迁徙 python manage.py sqlmigrate &lt;app_name&gt; 0001查看将要执行的sql语句 Admin的使用 1.在admin.py中注册相应的类,admin.site.regist...

cod16xx的博客 280
上一篇: 以Python Imaging Library 进行影像资料处理PIL
下一篇: 在Django数据库中添加具有初始值的字段
Java2King
博客等级 码龄18年 221粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值