django views.py在views层用get.objects取的数据能修改吗

Django中更新多个对象数据与删除对象的方法
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Django中更新多个对象数据与删除对象的方法,Django是Python重多各色框架中人气最高的一个,需要的朋友可以参考下
更新多个对象
例如说我们现在想要将Apress Publisher的名称由原来的”Apress”更改为”Apress Publishing”。若使用save()方法,如:
&&& p = Publisher.objects.get(name='Apress')
&&& p.name = 'Apress Publishing'
&&& p.save()
这等同于如下SQL语句:
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name = 'Apress';
UPDATE books_publisher SET
name = 'Apress Publishing',
address = '2855 Telegraph Ave.',
city = 'Berkeley',
state_province = 'CA',
country = 'U.S.A.',
website = ''
WHERE id = 52;
(注意在这里我们假设Apress的ID为52)
在这个例子里我们可以看到Django的save()方法更新了不仅仅是name列的值,还有更新了所有的列。 若name以外的列有可能会被其他的进程所改动的情况下,只更改name列显然是更加明智的。 更改某一指定的列,我们可以调用结果集(QuerySet)对象的update()方法: 示例如下:
&&& Publisher.objects.filter(id=52).update(name='Apress Publishing')
与之等同的SQL语句变得更高效,并且不会引起竞态条件。
UPDATE books_publisher
SET name = 'Apress Publishing'
WHERE id = 52;
update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录。 以下示例演示如何将所有Publisher的country字段值由'U.S.A'更改为'USA':
&&& Publisher.objects.all().update(country='USA')
update()方法会返回一个整型数值,表示受影响的记录条数。 在上面的例子中,这个值是2。
删除数据库中的对象只需调用该对象的delete()方法即可:
&&& p = Publisher.objects.get(name="O'Reilly")
&&& p.delete()
&&& Publisher.objects.all()
[&Publisher: Apress Publishing&]
同样我们可以在结果集上调用delete()方法同时删除多条记录。这一点与我们上一小节提到的update()方法相似:
&&& Publisher.objects.filter(country='USA').delete()
&&& Publisher.objects.all().delete()
&&& Publisher.objects.all()
删除数据时要谨慎! 为了预防误删除掉某一个表内的所有数据,Django要求在删除表内所有数据时显示使用all()。 比如,下面的操作将会出错:
&&& Publisher.objects.delete()
Traceback (most recent call last):
File "&console&", line 1, in &module&
AttributeError: 'Manager' object has no attribute 'delete'
而一旦使用all()方法,所有数据将会被删除:
&&& Publisher.objects.all().delete()
如果只需要删除部分的数据,就不需要调用all()方法。再看一下之前的例子:
&&& Publisher.objects.filter(country='USA').delete()
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具  HTTP 应用的信息是通过&请求报文&和&响应报文&传递的,关于更多的相关知识,可以阅读《HTTP权威指南》获得。
  其中 请求报文 由客户端发送,其中包含和许多的信息,而 django 将这些信息封装成了 HttpRequest 对象,该对象由&HttpRequest 类创建。每一个请求都会生成一个&HttpRequest 对象,django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。
def index(request):
return render(...)
当然你也可以使用其他参数来承接这个对象,并没有硬性规定一定要使用什么名称。
简单点说就是request也可以叫别的名字。
django将请求报文中的请求行、首部信息、内容主体封装成&HttpRequest 类中的属性。除了特殊说明的之外,其他均为只读的。
1.HttpRequest.scheme
  一个字符串,代表请求的方案,一般为 &http& 或 &https&。
2.HttpRequest.body
  一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML等。
  但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。
  另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。
3.HttpRequest.path
  一个字符串,表示请求的路径组件(不含域名)。
  例如:"/music/bands/the_beatles/"
4.HttpRequest.path_info
  一个字符串,在某些 Web 服务器配置下,主机名后的 URL 部分被分成脚本前缀部分和路径信息部分。path_info 属性将始终包含路径信息部分,不论使用的Web 服务器是什么。
使用它代替 path 可以让代码在测试和开发环境中更容易地切换。
  例如,如果应用的WSGIScriptAlias 设置为"/minfo",那么当 path 是"/minfo/music/bands/the_beatles/" 时path_info 将是"/music/bands/the_beatles/"。
5.HttpRequest.method
  一个字符串,表示请求使用的HTTP 方法。必须使用大写。
  例如:"GET"、"POST"
6.HttpRequest.encoding
  一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。
这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。
如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。
7.HttpRequest.GET
  一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象
8.HttpRequest.POST
  一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
  POST 请求可以带有空的 POST 字典 && 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。
因此,不应该使用 if request.POST
来检查使用的是否是POST 方法;
应该使用 if request.method == "POST"
  另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。
&9.HttpRequest.REQUEST
  一个类似于字典的对象,它首先搜索POST,然后搜索GET,主要是为了方便。灵感来自于PHP 的 $_REQUEST。
  例如,如果 GET = {"name": "john"}
而 POST = {"age": '34'} , REQUEST["name"]
将等于"john", REQUEST["age"]
将等于"34"。
  强烈建议使用 GET 和 POST 而不要用REQUEST,因为它们更加明确。
10.HttpRequest.COOKIES
  一个标准的Python 字典,包含所有的cookie。键和值都为字符串。
&11.HttpRequest.FILES
  一个类似于字典的对象,包含所有的上传文件信息。FILES 中的每个键为&input type="file" name="" /& 中的name,值则为对应的数据。
  注意,FILES 只有在请求的方法为POST 且提交的&form& 带有enctype="multipart/form-data" 的情况下才会包含数据。  否则,FILES 将为一个空的类似于字典的对象。
&12.HttpRequest.META
一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
CONTENT_LENGTH && 请求的正文的长度(是一个字符串)。
CONTENT_TYPE && 请求的正文的MIME 类型。
HTTP_ACCEPT && 响应可接收的Content-Type。
HTTP_ACCEPT_ENCODING && 响应可接收的编码。
HTTP_ACCEPT_LANGUAGE && 响应可接收的语言。
HTTP_HOST && 客服端发送的HTTP Host 头部。
HTTP_REFERER && Referring 页面。
HTTP_USER_AGENT && 客户端的user-agent 字符串。
QUERY_STRING && 单个字符串形式的查询字符串(未解析过的形式)。
REMOTE_ADDR && 客户端的IP 地址。
REMOTE_HOST && 客户端的主机名。
REMOTE_USER && 服务器认证后的用户。
REQUEST_METHOD && 一个字符串,例如"GET" 或"POST"。
SERVER_NAME && 服务器的主机名。
SERVER_PORT && 服务器的端口(是一个字符串)。
&  从上面可以看到,除&CONTENT_LENGTH&和&CONTENT_TYPE&之外,请求中的任何 HTTP 首部转换为&META&的键时,都会将所有字母大写并将连接符替换为下划线最后加上&HTTP_& 前缀。所以,一个叫做&X-Bender&的头部将转换成&META&中的&HTTP_X_BENDER&键
13.HttpRequest.user
  一个&AUTH_USER_MODEL&类型的对象,表示当前登录的用户。
  如果用户当前没有登录,user&将设置为&django.contrib.auth.models.AnonymousUser&的一个实例。你可以通过&is_authenticated()&区分它们。
if request.user.is_authenticated():
# Do something for logged-in users.
# Do something for anonymous users.
&&  user&只有当Django 启用&AuthenticationMiddleware&中间件时才可用。
  class&models.AnonymousUser
  django.contrib.auth.models.AnonymousUser&类实现了django.contrib.auth.models.User&接口,但具有下面几个不同点:
id 永远为None。
username 永远为空字符串。
get_username() 永远返回空字符串。
is_staff 和 is_superuser 永远为False。
is_active 永远为 False。
groups 和 user_permissions 永远为空。
is_anonymous() 返回True 而不是False。
is_authenticated() 返回False 而不是True。
set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
&  New in Django 1.8:
  新增&AnonymousUser.get_username()&以更好地模拟&django.contrib.auth.models.User。
14.HttpRequest.session
  一个既可读又可写的类似于字典的对象,表示当前的会话。只有当Django 启用会话的支持时才可用。完整的细节参见会话的文档。
&15.HttpRequest.urlconf
  不是由Django 自身定义的,但是如果其它代码(例如,自定义的中间件类)设置了它,Django 就会读取它。
如果存在,它将用来作为当前的请求的Root URLconf,并覆盖 ROOT_URLCONF 设置。
&16.HttpRequest.resolver_match
一个 ResolverMatch 的实例,表示解析后的URL。这个属性只有在 URL 解析方法之后才设置,这意味着它在所有的视图中可以访问,但是在 URL 解析发生之前执行的中间件方法中不可以访问(比如process_request,但你可以使用 process_view 代替)。
1.HttpRequest.get_host()
  根据从HTTP_X_FORWARDED_HOST(如果打开 USE_X_FORWARDED_HOST,默认为False)和 HTTP_HOST 头部信息返回请求的原始主机。如果这两个头部没有提供相应的值,则使用SERVER_NAME 和SERVER_PORT,在PEP 3333 中有详细描述。
  USE_X_FORWARDED_HOST:一个布尔值,用于指定是否优先使用 X-Forwarded-Host 首部,仅在代理设置了该首部的情况下,才可以被使用。
  例如:"127.0.0.1:8000"
  注意:当主机位于多个代理后面时,get_host() 方法将会失败。除非使用中间件重写代理的首部。
&2.HttpRequest.get_full_path()
  返回 path,如果可以将加上查询字符串。
  例如:"/music/bands/the_beatles/?print=true"
&3.HttpRequest.build_absolute_uri(location)
  返回location 的绝对URI。如果location 没有提供,则使用request.get_full_path()的返回值。
  如果URI 已经是一个绝对的URI,将不会修改。否则,使用请求中的服务器相关的变量构建绝对URI。
  例如:"/music/bands/the_beatles/?print=true"
&4.HttpRequest.get_signed_cookie(key,&default=RAISE_ERROR,&salt='',&max_age=None)
  返回签名过的Cookie 对应的值,如果签名不再合法则返回django.core.signing.BadSignature。
  如果提供&default&参数,将不会引发异常并返回 default 的值。
  可选参数salt&可以用来对安全密钥强力攻击提供额外的保护。max_age&参数用于检查Cookie 对应的时间戳以确保Cookie 的时间不会超过max_age&秒。
&&& request.get_signed_cookie('name')
&&& request.get_signed_cookie('name', salt='name-salt')
'Tony' # 假设在设置cookie的时候使用的是相同的salt
&&& request.get_signed_cookie('non-existing-cookie')
KeyError: 'non-existing-cookie'
# 没有相应的键时触发异常
&&& request.get_signed_cookie('non-existing-cookie', False)
&&& request.get_signed_cookie('cookie-that-was-tampered-with')
BadSignature: ...
&&& request.get_signed_cookie('name', max_age=60)
SignatureExpired: Signature age
& 60 seconds
&&& request.get_signed_cookie('name', False, max_age=60)
&5.HttpRequest.is_secure()
如果请求时是安全的,则返回True;即请求通是过 HTTPS 发起的。
&6.HttpRequest.is_ajax()
  如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 相应的首部是否是字符串'XMLHttpRequest'。
  大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),你必须手工设置这个值来让 is_ajax() 可以工作。
  如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware, 你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。
&7.HttpRequest.read(size=None)
  像文件一样读取请求报文的内容主体,同样的,还有以下方法可用。
  HttpRequest.readline()
  HttpRequest.readlines()
  HttpRequest.xreadlines()
  其行为和文件操作中的一样。
  HttpRequest.__iter__():说明可以使用 for 的方式迭代文件的每一行。
阅读(...) 评论()在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
model定义如下:
class Tag(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100,verbose_name='名称')
def __unicode__(self):
return self.name
class Post(models.Model):
id = models.AutoField(primary_key=True)
author = models.ForeignKey(User)
post_date = models.DateField(verbose_name='日期', auto_now=True)
post_title = models.CharField(verbose_name='标题', max_length=100)
post_content = RichTextField(verbose_name='内容')
post_tag = models.ForeignKey(Tag, verbose_name='标签')
在views.py里我是这样写的:
def tag(request, tag):
post_list = Post.objects.filter(post_tag.name = tag)
return render_to_response('tag.html',{'post_list':post_list,'tag':tag})
直接报语法错误Unresolved reference ‘post_tag’,如果写成post_tag = tag,网页上会报
ValueError at /tag/test/
invalid literal for int() with base 10: 'test'
Request Method:
Request URL:
http://127.0.0.1:8000/tag/test/
Django Version:
Exception Type:
ValueError
Exception Value:
invalid literal for int() with base 10: 'test'
就是想筛选下post_tag等于tag的Post,究竟该怎么写?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
post_tag 这里是一个对象
pythondef tag(request, tag):
tag = Tag.object.get(name=tag)
post_list = Post.objects.filter(post_tag=tag)
return render_to_response('tag.html',{'post_list':post_list,'tag':tag})
django 的orm 查询属性不是用 . 而是用 __连接的,题主可以试试
post_list = Post.objects.filter(post_tag__name=tag)
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:用户名:itstrong
文章数:85
评论数:13
访问量:28736
注册日期:
阅读量:1297
阅读量:3317
阅读量:582587
阅读量:467366
51CTO推荐博文
CMDB实现数据展示功能部分代码。
def&asset(request):
&&&&asset&=&Asset.objects.all()
&&&&return&render_to_response("asset.html",{'asset':&asset})
class&Asset(models.Model):
&&&&ipaddr&=&models.CharField(max_length=20,&verbose_name=u'IP地址',&primary_key=True)&&#需定义primary_key,否则会自动创建id列
&&&&hostname&=&models.CharField(max_length=30,&verbose_name=u'主机名')
&&&&nodes&=&models.CharField(max_length=20,&verbose_name=u'应用节点')
&&&&applications&=&models.CharField(max_length=30,&verbose_name=u'应用名')
&&&&group&=&models.CharField(max_length=20,&verbose_name=u'应用组名')
&&&&memory&=&models.CharField(max_length=5,&verbose_name='内存大小')
&&&&env&=&models.CharField(max_length=5,&verbose_name='环境变量')
&&&&flag&=&models.PositiveSmallIntegerField(verbose_name=u'flag')
&&&&#def&__unicode__(self):
&&&&#&&&&return&u'%s,%s,%s,%s,%s,%s,%s,%s'&%(self.ipaddr,&self.hostname,&self.nodes,&self.app,&self.group,&self.memory,&self.disk,&self.cpu)
&&&&class&Meta:
&&&&&&&&db_table&=&'fcenv_copy'&&#表名,默认为app名+类名
&&&&&&&&verbose_name&=&u'主机资产信息'
&&&&&&&&verbose_name_plural&=&u'主机资产信息管理'
asset.html
&table&class="table&table-striped&table-bordered&table-hover&"&id="editable"&name="editable"&
&&&&&thead&class="fixedThead"&
&&&&&&&&&tr&
&!--&&&&&&&&&&&&&th&class="text-center"&
&&&&&&&&&&&&&&&&&input&id="checkall"&type="checkbox"&class="i-checks"&name="checkall"&value="checkall"&data-editable="false"&onclick="check_all('asset_form')"&
&&&&&&&&&&&&&/th&&&--&
&&&&&&&&&&&&&th&class="text-center"&name="ip"&&IP地址&&/th&
&&&&&&&&&&&&&th&class="text-center"&width="80px"&&机器名&&/th&
&&&&&&&&&&&&&th&class="text-center"&&节点&&/th&
&&&&&&&&&&&&&th&class="text-center"&width="300px"&&应用名称&&/th&
&&&&&&&&&&&&&th&class="text-center"&width="100px"&&组别&&/th&
&&&&&&&&&&&&&th&class="text-center"&&内存&&/th&
&&&&&&&&&&&&&th&class="text-center"&width="200px"&&环境变量&&/th&
&&&&&&&&&&&&&th&class="text-center"&&flag&&/th&
&&&&&&&&&&&&&th&class="text-center"&width="200px"&&操作&&/th&
&&&&&&&&&/tr&
&&&&&/thead&
&&&&&tbody&class="scrollTbody"&
{%&for&value&in&asset&%}
&tr&class="gradeX"&
&td&class="text-center"&{{&value.ipaddr&}}&/a&&/td&
&td&class="text-center&hostname"&{{&value.hostname&}}&/a&&/td&
&td&class="text-center"&{{&value.nodes&}}&/a&&/td&
&td&class="text-center"&{{&value.applications&}}&/a&&/td&
&td&class="text-center"&{{&value.group&}}&/a&&/td&
&td&class="text-center"&{{&value.memory&}}&/a&&/td&
&td&class="text-center"&{{&value.env&}}&/a&&/td&
&td&class="text-center"&{{&value.flag&}}&/a&&/td&
&td&class="text-center"&data-editable="false"&
&&&&&a&href="#"&class="btn&btn-xs&btn-info"&编辑&/a&
&&&&&a&value="#"&class="conn&btn&btn-xs&btn-warning"&连接&/a&
&&&&&a&value="#"&class="btn&btn-xs&btn-danger&asset_del"&删除&/a&
{%&endfor&%}
&&&&&/tbody&
&/table&以下是常用ORM操作:& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&from&django.db.models&import&Count,&Min,&Max,&Sum&&&&&&&&& & &多表关联查询。from&django.db&import&models
class&Reporter(models.Model):
&&&&first_name&=&models.CharField(max_length=30)
&&&&last_name&=&models.CharField(max_length=30)
&&&&email&=&models.EmailField()
&&&&def&__str__(self):&&&&&&&&&&&&&&#&__unicode__&on&Python&2
&&&&&&&&return&"%s&%s"&%&(self.first_name,&self.last_name)
class&Article(models.Model):
&&&&headline&=&models.CharField(max_length=100)
&&&&pub_date&=&models.DateField()
&&&&reporter&=&models.ForeignKey(Reporter,&on_delete=models.CASCADE)
&&&&def&__str__(self):&&&&&&&&&&&&&&#&__unicode__&on&Python&2
&&&&&&&&return&self.headline
&&&&class&Meta:
&&&&&&&&ordering&=&('headline',)
&&&&r.article_set.filter(headline__startswith='This')
&QuerySet&[&Article:&This&is&a&test&]&#&Find&all&Articles&for&any&Reporter&whose&first&name&is&"John".
&&&&Article.objects.filter(reporter__first_name='John')
&QuerySet&[&Article:&John's&second&story&,&&Article:&This&is&a&test&]&效果图。附件是样式文件。本文出自 “” 博客,请务必保留此出处
了这篇文章
附件下载:  
类别:┆阅读(0)┆评论(0)
请输入验证码:

我要回帖

更多关于 django objects.get 的文章

 

随机推荐