django models 操作,django models 数据初始化
一、ORM增加
从django.db导入模型
类发行者(模型。型号):
名称=型号CharField(max_length=30,verbose_name=名称)
地址=型号CharField(地址最大长度=50)
城市=模特CharField(城市,max_length=60)
州_省=模型CharField(max_length=30)
国家=型号CharField(max_length=50)
网站=模特URLField()
类别元:
详细名称=出版商
详细名称复数=详细名称
def __str__(self):
返回自己的名字
类作者(模型。型号):
名称=型号CharField(max_length=30)
def __str__(self):
返回自己的名字
类作者详细信息(模型。型号):
性=模特BooleanField(max_length=1,choices=((0,男),(1, 女),))
邮件=模特。电子邮件字段()
地址=型号CharField(max_length=50)
生日=模特。日期字段()
作者=模特OneToOneField(作者)
课堂用书(模型。型号):
标题=模型CharField(max_length=100)
作者=模型ManyToManyField(作者)
发布者=模型。外键(发布者)
发布日期=模型。日期字段()
价格=车型. DecimalField(max_digits=5,decimal_places=2,默认值=10)
def __str__(self):
返回自我标题
从app01 .模型导入*
#创建方式一:作者。对象。创建(name= Alvin )
#创建方式二:作者。对象。创建(* * { name : Alex })
#保存方式一:作者=作者(name=alvin) #对象创建方式
author.save()
#保存方式二:author=Author() #对象属性添加方式
author.name=alvin
author.save()
增加一对多与多对多字段信息:
#一对多(外键):
#方式一:由于绑定一对多的字段,比如发布,存到数据库中的字段名叫发布标识,所以我们可以直接给这个
# 字段设定对应值:
Book.objects.create(title=php ,
publisher_id=2,#这里的2是指为该书对象绑定了出版者表中id=2的行对象
publication_date=2017-7-7 ,
价格=99英镑)
#方式二:
# 1 先获取要绑定的出版者对象:
pub_obj=Publisher(name=河大出版社,地址=保定,城市=保定,
州省=河北,country=China ,website=http://www.hbu.com )
# 或者
pub _ obj=publisher。对象。get(id=1)
# 2 将publisher_id=2改为publisher=pub_obj
Book.objects.create(title=php ,
publisher=pub_obj,
publication_date=2017-7-7 ,
价格=99英镑)
#多对多(ManyToManyField()):
作者1=作者。对象。get(id=1)
作者2=作者。对象。过滤器(name= Alvin )[0]
book=Book.objects.get(id=1)
book.authors.add(作者1、作者2)
#等同于:
book.authors.add(*[author1,author2])
book.authors.remove(*[author1,author2])
# -
书=模型Book.objects.filter(id__gt=1)
作者=模型Author.objects.filter(id=1)[0]
authors.book_set.add(*book)
authors.book_set.remove(*book)
# -
book.authors.add(1)
book.authors.remove(1)
authors.book_set.add(1)
authors.book_set.remove(1)
#注意:如果第三张表是通过模特ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
# 如果第三张表是自己创建的:
第二册作者(模特。型号):
作者=模特。外键("作者")
书=模型。外键("书")
# 那么就还有一种方式:
author_obj=models .Author.objects.filter(id=2)[0]
模型.Book.objects.filter(id=3)[0]
s=模型第二册作者。对象。创建(作者标识=1,图书标识=2)
保存()
s=模型Book2Author(author=author_obj,Book_id=1)
保存()
二、ORM删除Book.objects.filter(id=1).删除()注意:表面上是删除了一条,实际上姜戈会默认把這个记录关联的字段,全部删除!这种删除方式也称为级联删除。
三、ORM修改
# 方式一
author=Author.objects.get(id=5)
author.name=teQ
author.save()
# 方式二
Publish.objects.filter(id=2).更新(name=teQ )
注意:
1 .更新不能修改一个单一对象,也就是说对于获取()获取的数据,是不能用更新。而过滤器()获取的数据是一个查询对象,而更新默认是修改一个数据集合的。
2.注意以下区别:
# -更新方法直接设定对应属性-
模特。Book.objects.filter(id=3)。更新(title=PHP )
##sql:
# #更新 app 01 _ book SET title = PHP WHERE app 01 _ book 。id =3;args=(PHP ,3)
# - Save方法会重置所有属性,效率很低。
obj=模特。Book.objects.filter(id=3)[0]
Python
obj.save()
#选择“app01_book”。id , app01_book 。标题, app01_book 。价格,
# app01_book 。颜色, app01_book 。页码,
# app01_book 。“app01_book”中的“publisher_id”,其中“app01_book”。id=3极限1;
#
# UPDATE app 01 _ book SET title = Python , price=3333, color=red , page_num=556,
# publisher_id=1,其中 app01_book 。id =3;
查看代码
四。ORM查询1。查询API
#查询相关API:
# 1过滤器(**kwargs):它包含符合给定过滤标准的对象。
# 2 all():查询所有结果
# 3 get(**kwargs):返回符合给定过滤条件的对象,并且只返回一个结果。如果有多个对象或没有对象符合过滤条件,将会引发错误。
# -以下方法是
# 4 values(*field):返回一个ValueQuerySet——特殊的QuerySet。运行后,你得到的不是一系列模型的实例化对象,而是一个迭代的字典序列。
# 5 exclude(**kwargs):它包含不符合给定过滤标准的对象。
# 6 order_by(*field):对查询结果进行排序。
# 7 reverse():对查询结果进行反向排序。
# 8 distinct():从返回的结果中消除重复记录。
# 9 values_list(*field):与values()非常相似,它返回一个元组序列,values返回一个字典序列。
# 10 count():返回数据库中与查询匹配的对象的数量。
# 11 first():返回第一条记录
# 12 last():返回最后一条记录
# 13 exists():如果QuerySet包含数据,则返回True,否则返回False。
2.单表查询
-
# models . tb1 . objects . filter(id _ _ lt=10,ID _ _ gt=1) #获取ID大于1小于10的值
# models . tb1 . objects . filter(id _ _ in=[11,22,33]) #获取ID等于11,22,33的数据
#型号。Tb1.objects.exclude(id__in=[11,22,33]) # not in
#型号。tb1 . objects . filter(name _ _ contains= ven )
# models . tb1 . objects . filter(name _ _ icontains= ven )# icontains不区分大小写。
# models . tb1 . objects . filter(id _ _ range=[1,2]) # range bettwen和
# startswith,istartswith,endswith,iendswith,
3.QuerySet惯性机制:Publisher.objects.all()或。过滤器()等。都只是返回一个QuerySet(查询结果集对象),并不立即执行sql,只是在调用QuerySet时才执行。
特征:迭代和切片
# objs=模型。Book.objects.all()#[obj1,obj2,ob3.]
#QuerySet:迭代
# for obj in objs:#每个obj都是一个行对象。
# print(obj:,obj)
# QuerySet:可滑动
# print(对象[1])
# print(对象[1:4])
# print(对象[:-1])
4.对象查询、单表条件查询、多表条件联查。
# Book与Publisher有一对多的关系。
# -
#正向查找
ret1=型号。Book.objects.first()
打印(ret1.title)
打印(ret1.price)
打印(ret1.publisher)
Print(ret1.publisher.name) #由于一对多关系,ret1.publisher是一个对象,而不是queryset集合。
#反向查找
re=models . publish . objects . last()#获取不带外键字段的表对象。
打印(ret2.name)
打印(ret2.city)
#如何将Book对象绑定到它?
print(ret 2 . book _ set . all())# ret 2 . book _ set是一个queryset集合。
# -
#正向查找(条件)
# ret3=型号。book . objects . filter(title= Python )。值( id )
# print(ret3)#[{id: 1}]
#正向查找(条件)一对多
ret=models . book . objects . filter(title= python )。Values (publisher _ _ city) #查找图书出版商Python所在的城市。
print(ret 4)#[{ publisher _ _ city : Beijing }]
#多对多正向查找(条件)
ret5=型号。book . objects . filter(title= Python )。值(作者_ _姓名)
打印(返回5)
ret6=型号。book . objects . filter(author _ _ name= Alex )。值(“标题”)
打印(返回6)
#注意
# publisher in publisher__city或author__name,author是book表中的绑定字段。
#这里一对多和多对多的用法没有区别。
#反向查找(条件)-在没有外键的表中,查找其关联表的字段信息。
#一对多反向查找:
ret8=型号。publisher . objects . filter(book _ _ title= Python )。值(“名称”)
Print(ret8)#[{name :人大出版社 }]注意,book__title中的图书是出版社的关联表名。
ret9=型号。publisher . objects . filter(book _ _ title= Python )。值( book__authors )
print(ret 9)#[{ book _ _ authors :1 },{book__authors: 2}]
#多对多反向查找:
ret10=型号。author . objects . filter(book _ _ title= Python )。值(“名称”)
print(ret10)#[{name: alex},{name: alvin}]
#注意
#前瞻性图书_ _标题中的图书是表名图书。
#这里一对多和多对多的用法没有区别。
5.聚集查询和分组查询1 .聚集
通过QuerySet的计算返回聚合值的字典。aggregate()中每个参数指定字典中包含的返回值。也就是说,聚合是根据查询集生成的。
从django.db.models导入平均值、最小值、总和、最大值
#从整个查询集生成统计信息。例如,您想计算所有在售书籍的平均价格。Django的查询语法提供了一种描述所有#
#一堆书。
Book.objects.all()。合计(平均值(价格))
# { 价格_ _平均值:34.35}
# aggregate()子句的参数描述了我们要计算的聚合值,在本例中是图书模型中price字段的平均值。
# aggregate()是QuerySet的终止子句,这意味着它返回一个包含一些键值对的字典。键的名称是聚合#值的名称。
# identifier,该值是计算出的聚合值。键的名称是根据字段和聚合函数的名称自动生成的。如果要为聚合值指定
#一个名称,可以提供给聚合子句:
book . objects . aggregate(average _ price=Avg( price ))
# { 平均价格:34.35}
#如果你也想知道所有书的最高价和最低价,可以这样查询:
# book . objects . aggregate(Avg( price ),Max(price ),Min(price ))
# {price__avg: 34.35, price__max: Decimal(81.20 ), price__min: Decimal(12.99)}
2 .注释
您可以计算与查询结果中每个对象相关联的对象集,以获得总值(平均值或总和),也就是说,为查询集中的每个项目生成聚合。
#查询作者的所有书名teQ
book . objects . filter(authors _ _ name= teQ )。值(“标题”)
#查看作者所有书籍的总价teQ
book . objects . filter(authors _ _ name= teQ )。注释(总和(价格))
#对于作者出版的每本书,最高价:按作者姓名分组。
ret=book . objects . values( authors _ _ name )。注释(最高(价格))
#所有出版社出版的价格最低的书
ret=book . objects . values( publish _ _ name )。注释(最小(价格))
6.F查询和Q查询F使用查询条件的值来选择对象中的列值。
q查询提供了or操作。
#来自django.db.models导入F
#型号。tb1 . objects . update(num=F( num )1)
# Q构建搜索标准
从django.db.models导入Q
#1 Q对象(django.db.models.Q)可以封装关键字参数,以便更好地应用多个查询。
q1=型号。book . objects . filter(Q(title _ _ starts with= P ))。全部()
print(q1)#[ Book: Python,Book: Perl ]
# 2,可以组合使用,运算符,当一个运算符用于两个Q对象时,会产生一个新的Q对象。
Q(title _ _ starts with= P ) Q(title _ _ starts with= J )
# 3、Q宾语可放在~运算符前表示否定,也可允许否定与非否定的组合。
Q(title _ _ starts with= P ) ~ Q(pub _ date _ _ year=2005)
# 4、应用范围:
Book.objects.get(
Q(title__startswith=P ),
Q(发布日期=日期(2005,5,2)) Q(发布日期=日期(2005,5,6))
)
#sql:
#从民意调查中选择*问题,如“P%”
# AND(发布日期=2005年5月2日或发布日期=2005年5月6日)
#导入日期时间
# e=datetime.date(2005,5,6) #2005-05-06
# 5、问对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
# 正确:
Book.objects.get(
问(发布日期=日期(2005,5,2)) Q(发布日期=日期(2005,5,6)),
title__startswith=P )
# 错误:
Book.objects.get(
问题_ _以=P 开头,
问(发布日期=日期(2005,5,2)) Q(发布日期=日期(2005,5,6))
参考
一、ORM增加
从django.db导入模型
类发行者(模型。型号):
名称=型号CharField(max_length=30,verbose_name=名称)
地址=型号CharField(地址最大长度=50)
城市=模特CharField(城市,max_length=60)
州_省=模型CharField(max_length=30)
国家=型号CharField(max_length=50)
网站=模特URLField()
类别元:
详细名称=出版商
详细名称复数=详细名称
def __str__(self):
返回自己的名字
类作者(模型。型号):
名称=型号CharField(max_length=30)
def __str__(self):
返回自己的名字
类作者详细信息(模型。型号):
性=模特BooleanField(max_length=1,choices=((0,男),(1, 女),))
邮件=模特。电子邮件字段()
地址=型号CharField(max_length=50)
生日=模特。日期字段()
作者=模特OneToOneField(作者)
课堂用书(模型。型号):
标题=模型CharField(max_length=100)
作者=模型ManyToManyField(作者)
发布者=模型。外键(发布者)
发布日期=模型。日期字段()
价格=车型. DecimalField(max_digits=5,decimal_places=2,默认值=10)
def __str__(self):
返回自我标题
从app01 .模型导入*
#创建方式一:作者。对象。创建(name= Alvin )
#创建方式二:作者。对象。创建(* * { name : Alex })
#保存方式一:作者=作者(name=alvin) #对象创建方式
author.save()
#保存方式二:author=Author() #对象属性添加方式
author.name=alvin
author.save()
增加一对多与多对多字段信息:
#一对多(外键):
#方式一:由于绑定一对多的字段,比如发布,存到数据库中的字段名叫发布标识,所以我们可以直接给这个
# 字段设定对应值:
Book.objects.create(title=php ,
publisher_id=2,#这里的2是指为该书对象绑定了出版者表中id=2的行对象
publication_date=2017-7-7 ,
价格=99英镑)
#方式二:
# 1 先获取要绑定的出版者对象:
pub_obj=Publisher(name=河大出版社,地址=保定,城市=保定,
州省=河北,country=China ,website=http://www.hbu.com )
# 或者
pub _ obj=publisher。对象。get(id=1)
# 2 将publisher_id=2改为publisher=pub_obj
Book.objects.create(title=php ,
publisher=pub_obj,
publication_date=2017-7-7 ,
价格=99英镑)
#多对多(ManyToManyField()):
作者1=作者。对象。get(id=1)
作者2=作者。对象。过滤器(name= Alvin )[0]
book=Book.objects.get(id=1)
book.authors.add(作者1、作者2)
#等同于:
book.authors.add(*[author1,author2])
book.authors.remove(*[author1,author2])
# -
书=模型Book.objects.filter(id__gt=1)
作者=模型Author.objects.filter(id=1)[0]
authors.book_set.add(*book)
authors.book_set.remove(*book)
# -
book.authors.add(1)
book.authors.remove(1)
authors.book_set.add(1)
authors.book_set.remove(1)
#注意:如果第三张表是通过模特ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
# 如果第三张表是自己创建的:
第二册作者(模特。型号):
作者=模特。外键("作者")
书=模型。外键("书")
# 那么就还有一种方式:
author_obj=models .Author.objects.filter(id=2)[0]
模型.Book.objects.filter(id=3)[0]
s=模型第二册作者。对象。创建(作者标识=1,图书标识=2)
保存()
s=模型Book2Author(author=author_obj,Book_id=1)
保存()
二、ORM删除Book.objects.filter(id=1).删除()注意:表面上是删除了一条,实际上姜戈会默认把這个记录关联的字段,全部删除!这种删除方式也称为级联删除。
三、ORM修改
# 方式一
author=Author.objects.get(id=5)
author.name=teQ
author.save()
#模式2
Publish.objects.filter(id=2)。更新(name=teQ )
注意:
1.update不能修改单个对象,也就是说get()得到的数据不能更新。filter()获取的数据是QuerySet对象,update默认修改数据集。
2.请注意以下差异:
# - Update方法直接设置相应的属性。
模特。Book.objects.filter(id=3)。更新(title=PHP )
##sql:
# #更新 app 01 _ book SET title = PHP WHERE app 01 _ book 。id =3;args=(PHP ,3)
# - Save方法会重置所有属性,效率很低。
obj=模特。Book.objects.filter(id=3)[0]
Python
obj.save()
#选择“app01_book”。id , app01_book 。标题, app01_book 。价格,
# app01_book 。颜色, app01_book 。页码,
# app01_book 。“app01_book”中的“publisher_id”,其中“app01_book”。id=3极限1;
#
# UPDATE app 01 _ book SET title = Python , price=3333, color=red , page_num=556,
# publisher_id=1,其中 app01_book 。id =3;
查看代码
四。ORM查询1。查询API
#查询相关API:
# 1过滤器(**kwargs):它包含符合给定过滤标准的对象。
# 2 all():查询所有结果
# 3 get(**kwargs):返回符合给定过滤条件的对象,并且只返回一个结果。如果有多个对象或没有对象符合过滤条件,将会引发错误。
# -以下方法是
# 4 values(*field):返回一个ValueQuerySet——特殊的QuerySet。运行后,你得到的不是一系列模型的实例化对象,而是一个迭代的字典序列。
# 5 exclude(**kwargs):它包含不符合给定过滤标准的对象。
# 6 order_by(*field):对查询结果进行排序。
# 7 reverse():对查询结果进行反向排序。
# 8 distinct():从返回的结果中消除重复记录。
# 9 values_list(*field):与values()非常相似,它返回一个元组序列,values返回一个字典序列。
# 10 count():返回数据库中与查询匹配的对象的数量。
# 11 first():返回第一条记录
# 12 last():返回最后一条记录
# 13 exists():如果QuerySet包含数据,则返回True,否则返回False。
2.单表查询
-
# models . tb1 . objects . filter(id _ _ lt=10,ID _ _ gt=1) #获取ID大于1小于10的值
# models . tb1 . objects . filter(id _ _ in=[11,22,33]) #获取ID等于11,22,33的数据
#型号。Tb1.objects.exclude(id__in=[11,22,33]) # not in
#型号。tb1 . objects . filter(name _ _ contains= ven )
# models . tb1 . objects . filter(name _ _ icontains= ven )# icontains不区分大小写。
# models . tb1 . objects . filter(id _ _ range=[1,2]) # range bettwen和
# startswith,istartswith,endswith,iendswith,
3.QuerySet惯性机制:Publisher.objects.all()或。过滤器()等。都只是返回一个QuerySet(查询结果集对象),并不立即执行sql,只是在调用QuerySet时才执行。
特征:迭代和切片
# objs=模型。Book.objects.all()#[obj1,obj2,ob3.]
#QuerySet:迭代
# for obj in objs:#每个obj都是一个行对象。
# print(obj:,obj)
# QuerySet:可滑动
# print(对象[1])
# print(对象[1:4])
# print(对象[:-1])
4.对象查询、单表条件查询、多表条件联查。
# Book与Publisher有一对多的关系。
# -
#正向查找
ret1=型号。Book.objects.first()
打印(ret1.title)
打印(ret1.price)
打印(ret1.publisher)
Print(ret1.publisher.name) #由于一对多关系,ret1.publisher是一个对象,而不是queryset集合。
#反向查找
re=models . publish . objects . last()#获取不带外键字段的表对象。
打印(ret2.name)
打印(ret2.city)
#如何将Book对象绑定到它?
print(ret 2 . book _ set . all())# ret 2 . book _ set是一个queryset集合。
# -
#正向查找(条件)
# ret3=型号。book . objects . filter(title= Python )。值( id )
# print(ret3)#[{id: 1}]
#正向查找(条件)一对多
ret=models . book . objects . filter(title= python )。Values (publisher _ _ city) #查找图书出版商Python所在的城市。
print(ret 4)#[{ publisher _ _ city : Beijing }]
#多对多正向查找(条件)
ret5=型号。book . objects . filter(title= Python )。值(作者_ _姓名)
打印(返回5)
ret6=型号。book . objects . filter(author _ _ name= Alex )。值(“标题”)
打印(返回6)
#注意
# publisher in publisher__city或author__name,author是book表中的绑定字段。
#这里一对多和多对多的用法没有区别。
#反向查找(条件)-在没有外键的表中,查找其关联表的字段信息。
#一对多反向查找:
ret8=型号。publisher . objects . filter(book _ _ title= Python )。值(“名称”)
Print(ret8)#[{name :人大出版社 }]注意,book__title中的图书是出版社的关联表名。
ret9=型号。publisher . objects . filter(book _ _ title= Python )。值( book__authors )
print(ret 9)#[{ book _ _ authors :1 },{book__authors: 2}]
#多对多反向查找:
ret10=型号。author . objects . filter(book _ _ title= Python )。值(“名称”)
print(ret10)#[{name: alex},{name: alvin}]
#注意
#前瞻性图书_ _标题中的图书是表名图书。
#这里一对多和多对多的用法没有区别。
5.聚集查询和分组查询1 .聚集
通过QuerySet的计算返回聚合值的字典。aggregate()中每个参数指定字典中包含的返回值。也就是说,聚合是根据查询集生成的。
从django.db.models导入平均值、最小值、总和、最大值
#从整个查询集生成统计信息。例如,您想计算所有在售书籍的平均价格。Django的查询语法提供了一种描述所有#
#一堆书。
Book.objects.all()。合计(平均值(价格))
# { 价格_ _平均值:34.35}
# aggregate()子句的参数描述了我们要计算的聚合值,在本例中是图书模型中price字段的平均值。
# aggregate()是QuerySet的终止子句,这意味着它返回一个包含一些键值对的字典。键的名称是聚合#值的名称。
# identifier,该值是计算出的聚合值。键的名称是根据字段和聚合函数的名称自动生成的。如果要为聚合值指定
#一个名称,可以提供给聚合子句:
book . objects . aggregate(average _ price=Avg( price ))
# { 平均价格:34.35}
#如果你也想知道所有书的最高价和最低价,可以这样查询:
# book . objects . aggregate(Avg( price ),Max(price ),Min(price ))
# {price__avg: 34.35, price__max: Decimal(81.20 ), price__min: Decimal(12.99)}
2 .注释
您可以计算与查询结果中每个对象相关联的对象集,以获得总值(平均值或总和),也就是说,为查询集中的每个项目生成聚合。
#查询作者的所有书名teQ
book . objects . filter(authors _ _ name= teQ )。值(“标题”)
#查看作者所有书籍的总价teQ
book . objects . filter(authors _ _ name= teQ )。注释(总和(价格))
#对于作者出版的每本书,最高价:按作者姓名分组。
ret=book . objects . values( authors _ _ name )。注释(最高(价格))
#所有出版社出版的价格最低的书
ret=book . objects . values( publish _ _ name )。注释(最小(价格))
6.F查询和Q查询F使用查询条件的值来选择对象中的列值。
q查询提供了or操作。
#来自django.db.models导入F
#型号。tb1 . objects . update(num=F( num )1)
# Q构建搜索标准
从django.db.models导入Q
#1 Q对象(django.db.models.Q)可以封装关键字参数,以便更好地应用多个查询。
q1=型号。book . objects . filter(Q(title _ _ starts with= P ))。全部()
print(q1)#[ Book: Python,Book: Perl ]
# 2,可以组合使用,运算符,当一个运算符用于两个Q对象时,会产生一个新的Q对象。
Q(title _ _ starts with= P ) Q(title _ _ starts with= J )
# 3、Q宾语可放在~运算符前表示否定,也可允许否定与非否定的组合。
Q(title _ _ starts with= P ) ~ Q(pub _ date _ _ year=2005)
# 4、应用范围:
Book.objects.get(
Q(title__startswith=P ),
Q(发布日期=日期(2005,5,2)) Q(发布日期=日期(2005,5,6))
)
#sql:
#从民意调查中选择*问题,如“P%”
# AND(发布日期=2005年5月2日或发布日期=2005年5月6日)
#导入日期时间
# e=datetime.date(2005,5,6) #2005-05-06
# 5、Q对象可以和关键字参数查询一起使用,但是一定要把Q对象放在关键字参数查询的前面。
#正确:
Book.objects.get(
Q(发布日期=日期(2005,5,2)) Q(发布日期=日期(2005,5,6)),
title__startswith=P )
#错误:
Book.objects.get(
问题_ _以=P 开头,
Q(发布日期=日期(2005,5,2)) Q(发布日期=日期(2005,5,6))
涉及
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。