目录

  • 必知必会的13条查询方法
  • 单表查询之神奇的双下划线
  • 一对多 ForeignKey
  • 多对多 ManyToManyField
  • 在Python脚本中调用Django环境
  • Django终端打印SQL语句
  • 关于Mate类
  • 聚合查询 aggregage()
  • 分组查询 annotate()
  • F查询
  • Q查询
  • 事务
  • 其它鲜为人知的操作

@
***

必知必会的13条查询方法

==1. all()==
查询所有结果
.
==2. get(kwargs)==
返回与所给筛选条件相匹配的对象,返回结果有且只有一个.
如果符合筛选条件的对象超过一个或者没有,都将抛出异常.
.
==3. filter(kwargs)==
返回所有符合筛选条件的对象.
.
==4. exclude(kwargs)==
返回所有不符合筛选条件的对象
.
==5. values(field)==
返回一个ValueQuerySet(一个特殊的QuerySet).
运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列.
例如(返回值):
<QuerySet [{'id': 1, 'name': 'zyk', 'age': 24, 'birth': datetime.datetime(2018, 10, 11, 1, 17, 47, 380591, tzinfo=), 'phone': '17600390376'}]>
.
==6. values_list(
field)==
它与values()非常类似,它返回的是一个元组序列,values返回的是一字典序列
.
==7. order_by(field)==
对查询结果排序.
参数接收字符串类型的字段,指定按某个字段排序.
使用负号(例如"-1")可以实现降序.
.
==8. reverse()==
对查询结果反向排序.
通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法).
.
==9. distinct()==
从返回结果中剔除重复记录.
如果查询操作跨越多个表,可能在计算QuerySet时得到重复的结果,此时可以使用distnct(),注意只有在PostgreSQL中支持按字段去重.
它是对整个对象的去重,不是对数据去重.
.
==10. count()==
返回数据库中匹配查询(QuerySet)的对象那个数量.
.
==11 first()==
返回第一条记录
.
==12 last()==
返回最后一条记录
.
==13 exists()==
如果QuerySet包含数据返回True,否则False.
.
.
.
返回对象列表(QuerySet)的有:
all()
filter()
exclude()
order_by()
reverse()
distinct()
values() -> [{}]
values_list() -> [()]
.
返回具体对象的有:
get()
first()
last()
create()
.
返回布尔值的有:
existe()
.
返回数字的有:
count()

***

单表查询之神奇的双下划线

==filter(id__gt=2, id__lt=4)==
获取id 大于2 且 小于4 的对象.
.
==filter(id__gte=2, id__lte=4)==
获取id 大于等于2 且 小于等于4 的对象.
.
==filter(id__in=[2, 4])==
获取所有id等于2, 4的数据.
.
==filter(name__contains='yk')==
获取所有name字段包含'yk'的对象.
.
==filter(name__icontains='yk')==
获取所有name字段包含'yk'的对象,忽略大小写.
.
==filter(id__range=[1, 3])==
获取id范围在1-3的对象,顾头顾尾.
等价于SQL语句的bettwen and
.
==filter(date__year=2018)==
获取date字段时间为2018年的对象.
.
==__isnull = True==
判断字段是否为空, 为空返回True.
.
类似的还有:startswith, istartswith, endswith, iendswith

一对多 ForeignKey


正向查找

1. 对象查找(跨表)
语法:==对象.关联表.关联表的字段==
示例:

# 获取第一个学生对象:
stu_obj = models.Students.objects.first()
# 获取这个学生的班级对象:
stu_obj.classes
# 获取这个学生的班级对象名称:
stu_obj.classes.name

2. 字段查找(跨表)
语法:==关联表__关联表的字段==
示例:

# 获取id为7的学生的班级姓名:
models.Students.objects.filter(id=7).values_list('classes__name')

反向操作

1. 对象查找
语法:==obj.表名_set==
示例:

# 获取第一个班级:
class_obj = models.Classes.objects.first()
# 获取这个班级的所有学生:
students = class_obj.students_set.all()
# 获取这个班级所有学生的姓名:
students.values_list('name')

2. 字段查找
语法:==表名__字段==
示例:

# 获取id为9的班级的所有学生的姓名:
models.Classes.objects.filter(id=9).values_list('students__name')


多对多 ManyToManyField

"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.

他存在与下面两种情况:

  1. 外键关系的反向查询
  2. 多对多关联关系

简单来说,就是当点(.)后面的对象可能存在多个的时候就可以使用以下的方法:

==create()==
示例:

# 通过班级对象反向创建教师:
models.Classes.objects.first().teachers_set.create(name='teacher07')

.
==add()==
把指定的model对象添加到关联对象集中.
添加对象:

# 获取id为9, 10, 11的班级对象
class_objs = models.Classes.objects.filter(id__in=[9, 10, 11])
# 将这些班级添加到指定的教师对象行中
models.Teachers.objects.first().classes.add(*class_objs)

添加id:

models.Teachers.objects.first().classes.add(*[9, 10 ,11])

.
==set()==
更新model对象的关联对象.

# 获取教师对象
tea_obj = models.Teachers.objects.first()
# 将其重新设置班级
tea_obj.classes.set([9, 10, 11])

.
==remove()==
从关联的对象集中移除指定的model对象.

# 获取教师对象
tea_obj = models.Teachers.objects.first()
# 删除id为9的班级
tea_obj.classes.remove(9)

.
==clear()==
清空

# 获取教师对象
tea_obj = models.Teachers.objects.first()
# 删除所有班级
tea_obj.classes.clear()

.
==对于ForeignKey对象,clear() 与 remove() 方法仅在关联字段设置了null=True时存在.==

注意:
对于所有类型的关联字段,add()、create()、remove()、clear()、set() 都会立即更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法.

在Python脚本中调用Django环境



Django终端打印SQL语句

在Django项目的settings.py文件中,在最后复制粘贴如下代码:


LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}
}


关于Mate类

# 班级
class Classes(models.Model):name = models.CharField(max_length=64, verbose_name='姓名', db_column='myname')# db_column:自定义数据库列名    verbose_name:自定义admin网页中显示的字段名class Meta:# 自定义数据库中生成的表名称:db_table = 'classes'# admin网页中显示的表名称:# verbose_name = "班级"  # 会在名称后面加"s"verbose_name_plural = "班级信息"  # 不会在名称后面加"s"# 联合索引:# index_together = [#     ("字段1", "字段2")  # 应为两个存在的字段# ]# 联合唯一索引:# unique_together = (("字段1", "字段2"),)  # 应为两个存在的字段


聚合查询 aggregage()

aggregate()是QuerySet的一个终止子句(必须放在语句的最末尾),意思是说,他返回一个包含一些键值对的字典.

键的名称是聚合值的标识,值是计算出来的聚合值.
键的名称是按照字段和聚合函数的名称自动生成出来的.

需要用到的函数:

from django.db.models import Avg, Sum, Max, Min, Count

示例:

# 计算所有书的平均价格:
models.Book.objects.all().aggregate(Avg('price'))

可以为聚合的值指定名称(key):

models.Book.objects.all().aggregate(avg=Avg('price'))

还可以生成不止一个聚合函数(多个键值对):

# 同时获取书的平均价格, 最高价格, 最低价格:
models.Book.objects.all().aggregate(Avg('price'), Max('price'), Min('price'))


分组查询 annotate()

我们使用原生SQL语句,按照出版社分组求书的平均价格:

select pub,AVG(price) from book group by publisher;

如果使用ORM查询,语法如下:

models.Book.objects.values('publisher').annotate(avg=Avg('price')).values('publisher', 'avg')

连表查询的分组:
SQL查询:

select publisher.name,AVG(price) from book inner join bookon (book.publisher_id=book.id)group by book_id;

ORM查询:

models.Publisher.objects.annotate(avg=Avg('book__price')).values('name', 'avg')

更多示例:
统一每一本书的作者个数:

models.Book.objects.all().annotate(count=Count('author')).values('title', 'count')

统计出每个出版社卖的最便宜的书的价格:

# 方法一:
Publisher.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')# 方法二:
models.Book.objects.values('publisher__name').annotate(min_price=Min('price'))

统计不止一个作者的图书:

models.Book.objects.annotate(author_num=Count('author')).filter(author_num__gt=1)

根据一本图书作者数量的多少对查询集 QuerySet进行排序:

models.Book.objects.annotate(author_num=Count('author')).order_by('author_num')

查询各个作者出的书的总价格:

models.Author.objects.annotate(sum_price=Sum('book__price')).values('name', 'sum_price')


F查询

在上面的例子中,我们构造的过滤器都只是将字段值与某个常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢?

Django提供了F()来做这样的比较,==F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值.==

导入:

from django.db.models import F
# 查询库存大于销量的书:
models.Book.objects.filter(sale__gt=F('inve')).values('sale', 'inve')

==Djano支持F()对象之间,以及 F()对象和常数之间的加减乘除和取模的操作:==

# 查询库存大于销量2倍的书:
models.Book.objects.filter(sale__gt=F('inve') * 2).values('sale', 'inve')

==修改操作也可以使用F()函数:==

# 将每一本书的价格提高10元:
models.Book.objects.update(price=F('price') + 10)

引申:
如果要修改char字段咋办?
如:把所有书名后面加上(第一版):

from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'), Value("("), Value("第一版"), Value(")")))


Q查询

filter()等方法中的关键字参数查询都一起进行"AND"的,如果要执行更复杂的查询(例如OR查询),你可以使用Q对象.

导入:

from django.db.models import Q

示例:

# 查询作者名是"zyk"或"zyk01"的书:
models.Book.objects.filter(Q(author__name="zyk") | Q(author__name="zyk01")).values_list('title', 'author__name')

可以组合使用 ==&== 和 ==|== 操作符以及使用括号进行分组来编写任意复杂的Q对象。同时,Q对象可以使用 ==~== 操作符取反,这允许组合正常的查询和取反(NOT)查询.

示例:

# 查询作者名字是"zyk"并且不是2018年出版的书的书:
models.Book.objects.filter(Q(author__name="zyk") & ~Q(publish_date__year=2018)).values_list('title', 'author__name', 'publish_date')

查询函数可以混合使用Q对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q对象)都将"AND"在一起。但是,如果出现Q对象,它就必须位于所有关键字参数的前面。也就是所,==Q对象必须放在关键字参数的前面.==

示例:

# 查询出版年份是2017或2018,书名中带"逻辑"的所有书:
models.Book.objects.filter(Q(publish_date__year=2017) | Q(publish_date__year=2018), title__icontains="逻辑")

更多用法(项目摘):

def get_search_contion(self, query_list):"""模糊查询:param query_list: 数据库字段列表:return:"""query = self.request.GET.get('query', '')q = Q()q.connector = 'OR'for i in query_list:q.children.append(Q(('%s__contains' % i, query)))return q# 调用:
q = self.get_search_contion(sql_field)
all_customer = models.Customer.objects.filter(q, consultant__isnull=True)


事务

==要么都成功,要么都失败.==

import osif __name__ == '__main__':os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog.settings')import djangodjango.setup()from blog01 import modelstry:from django.db import transactionwith transaction.atomic():new_publisher = models.Publisher.objects.create(name="西二旗程序员太多出版社")models.Book.objects.create(title="Python终极爬虫", publisher_id=100)# 这里的"publisher_id=100"指定了一个不存在的id, 因此这两条语句都失败.except Exception as e:print(str(e))


其它鲜为人知的操作

行级锁:

def multi_apply(self):"""公户变私户"""ids = self.request.POST.getlist('id')apply_num = len(ids)# 判断当前销售的客户加上要转为私有的客户的总量是否大于最大限制if self.request.user.customers.count() + apply_num > settings.CUSTOMER_MAX_NUM:return HttpResponse("做人不要太贪心,给别人的机会")# 如果同时有多个销售抢一个客户:with transaction.atomic():# 事务# select_for_update:加锁obj_list = models.Customer.objects.filter(id__in=ids, consultant__isnull=True).select_for_update()if apply_num == len(obj_list):obj_list.update(consultant=self.request.user)else:return HttpResponse("手速太慢")

Django ORM执行原生SQL:

# extra
# 在QuerySet的基础上继续执行子语句
# extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)# select和select_params是一组,where和params是一组,tables用来设置from哪个表
# Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
# Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
# Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
# Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])举个例子:
models.UserInfo.objects.extra(select={'newid':'select count(1) from app01_usertype where id>%s'},select_params=[1,],where = ['age>%s'],params=[18,],order_by=['-age'],tables=['app01_usertype'])"""select app01_userinfo.id,(select count(1) from app01_usertype where id>1) as newidfrom app01_userinfo,app01_usertypewhere app01_userinfo.age > 18order by app01_userinfo.age desc"""# 执行原生SQL
# 更高灵活度的方式执行原生SQL语句
# from django.db import connection, connections
# cursor = connection.cursor()  # cursor = connections['default'].cursor()
# cursor.execute("""SELECT * from auth_user where id = %s""", [1])
# row = cursor.fetchone()

QuerySet方法大全:

##################################################################
# PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET #
##################################################################def all(self)# 获取所有的数据对象def filter(self, *args, **kwargs)# 条件查询# 条件可以是:参数,字典,Qdef exclude(self, *args, **kwargs)# 条件查询# 条件可以是:参数,字典,Qdef select_related(self, *fields)性能相关:表之间进行join连表操作,一次性获取关联的数据。总结:1. select_related主要针一对一和多对一关系进行优化。2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。def prefetch_related(self, *lookups)性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。总结:1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。def annotate(self, *args, **kwargs)# 用于实现聚合group by查询from django.db.models import Count, Avg, Max, Min, Sumv = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))# SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_idv = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)# SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)# SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1def distinct(self, *field_names)# 用于distinct去重models.UserInfo.objects.values('nid').distinct()# select distinct nid from userinfo注:只有在PostgreSQL中才能使用distinct进行去重def order_by(self, *field_names)# 用于排序models.UserInfo.objects.all().order_by('-id','age')def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)# 构造额外的查询条件或者映射,如:子查询Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))Entry.objects.extra(where=['headline=%s'], params=['Lennon'])Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])def reverse(self):# 倒序models.UserInfo.objects.all().order_by('-nid').reverse()# 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序def defer(self, *fields):models.UserInfo.objects.defer('username','id')或models.UserInfo.objects.filter(...).defer('username','id')#映射中排除某列数据def only(self, *fields):#仅取某个表中的数据models.UserInfo.objects.only('username','id')或models.UserInfo.objects.filter(...).only('username','id')def using(self, alias):指定使用的数据库,参数为别名(setting中的设置)##################################################
# PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
##################################################def raw(self, raw_query, params=None, translations=None, using=None):# 执行原生SQLmodels.UserInfo.objects.raw('select * from userinfo')# 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名models.UserInfo.objects.raw('select id as nid from 其他表')# 为原生SQL设置参数models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])# 将获取的到列名转换为指定列名name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)# 指定数据库models.UserInfo.objects.raw('select * from userinfo', using="default")################### 原生SQL ###################from django.db import connection, connectionscursor = connection.cursor()  # cursor = connections['default'].cursor()cursor.execute("""SELECT * from auth_user where id = %s""", [1])row = cursor.fetchone() # fetchall()/fetchmany(..)def values(self, *fields):# 获取每行数据为字典格式def values_list(self, *fields, **kwargs):# 获取每行数据为元祖def dates(self, field_name, kind, order='ASC'):# 根据时间进行某一部分进行去重查找并截取指定内容# kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)# order只能是:"ASC"  "DESC"# 并获取转换后的时间- year : 年-01-01- month: 年-月-01- day  : 年-月-日models.DatePlus.objects.dates('ctime','day','DESC')def datetimes(self, field_name, kind, order='ASC', tzinfo=None):# 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间# kind只能是 "year", "month", "day", "hour", "minute", "second"# order只能是:"ASC"  "DESC"# tzinfo时区对象models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))"""pip3 install pytzimport pytzpytz.all_timezonespytz.timezone(‘Asia/Shanghai’)"""def none(self):# 空QuerySet对象####################################
# METHODS THAT DO DATABASE QUERIES #
####################################def aggregate(self, *args, **kwargs):# 聚合函数,获取字典类型聚合结果from django.db.models import Count, Avg, Max, Min, Sumresult = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))===> {'k': 3, 'n': 4}def count(self):# 获取个数def get(self, *args, **kwargs):# 获取单个对象def create(self, **kwargs):# 创建对象def bulk_create(self, objs, batch_size=None):# 批量插入# batch_size表示一次插入的个数objs = [models.DDD(name='r11'),models.DDD(name='r22')]models.DDD.objects.bulk_create(objs, 10)def get_or_create(self, defaults=None, **kwargs):# 如果存在,则获取,否则,创建# defaults 指定创建时,其他字段的值obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 2})def update_or_create(self, defaults=None, **kwargs):# 如果存在,则更新,否则,创建# defaults 指定创建时或更新时的其他字段obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 1})def first(self):# 获取第一个def last(self):# 获取最后一个def in_bulk(self, id_list=None):# 根据主键ID进行查找id_list = [11,21,31]models.DDD.objects.in_bulk(id_list)def delete(self):# 删除def update(self, **kwargs):# 更新def exists(self):# 是否有结果
复制代码
Django终端打印SQL语句在Django项目的settings.py文件中,在最后复制粘贴如下代码:复制代码
LOGGING = {'version': 1,'disable_existing_loggers': False,'handlers': {'console':{'level':'DEBUG','class':'logging.StreamHandler',},},'loggers': {'django.db.backends': {'handlers': ['console'],'propagate': True,'level':'DEBUG',},}
}

更多操作请见:【Django】ORM操作#1

转载于:https://www.cnblogs.com/zyk01/p/10176287.html

【Django】ORM操作#2相关推荐

  1. Django ORM操作

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条 ...

  2. Django - ORM操作

    Django - ORM操作 一. 必知必会13条 单表查询之神奇的双下划线 二. ForeignKey操作 正向查找 反向操作 三. ManyToManyField 四. 聚合查询和分组查询 聚合 ...

  3. django orm原理_django 动态创建一个模型的多个table name, 并通过 Django ORM 操作

    动态创建table, 并通过 Django ORM 操作. 动态的创建表 动态的创建模型其实就是在运行时生成 Model 类, 这个可以通过函数实现, 通过传参(今天的日期, 如: 20181211) ...

  4. django mysql orm教程_带你了解Django ORM操作(基础篇)

    前言 在日常开发中,需要大量对数据库进行增删改查操作. 如果头铁的话,使用原生SQL是最好的,毕竟性能又高,又灵活. 但是通常情况下,我们不是太需要那么苛刻的性能,也没有那么多刁钻的需求用原生SQL ...

  5. django ORM 操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  6. Django ORM

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  7. 第十八 django及ORM操作

    一.项目及ORM操作 1.添加新项目 python manage.py startapp blog 2.配置数据库类 models.py from django.db import models# C ...

  8. Django 之ORM操作

    1.什么是ORM? 全称关系对象映射Object Relational Mapping(简称ORM),是通过描述面向对象与数据库之间的对应的元数据,将对象持久化的更新到数据库中. 有了ORM,就不需要 ...

  9. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

最新文章

  1. 【网络流】 HDU 4183 Pahom on Water 拆点
  2. div设置百分比高度 宽度
  3. C语言:内存的分配与管理
  4. 自己动手制作一门语言(1)波罗语
  5. RecycleView的Item Animator动画
  6. useradd或adduser命令
  7. Linux / Unix Command: getprotobyname
  8. 华为关于gvrp 的配置,一般步骤以及应用。
  9. 剑指offer 数字在排序数组中出现的次数
  10. Mybatis-01-简介及入门
  11. Delphi7 请求webservice 方法。
  12. Oracle中相同字段补充,oracle一次给多表添加相同字段
  13. SPI oled ssd1306 esp8266
  14. 紫光华宇拼音输入法使用技巧
  15. 去除从网页上复制到WORD文档中的下箭头方法
  16. 载誉而归!昂视荣膺CAIMRS 2023「自动化创新奖」
  17. 手机如何测光照度_照度测定方法
  18. Transfer Learning 迁移学习的相关知识
  19. 互联网寒冬!docker安装nacos集群
  20. 网络安全的就业及发展前景如何?

热门文章

  1. 92. Reverse Linked List II
  2. 并发编程实战-第二章学习
  3. fckeditor2.63 上传图片的一个问题的解决办法
  4. 在.Net framework下遍历XML文挡树的两种算法
  5. real210开发板tslib1.4移植
  6. 字符设备驱动程序之按键——同步互斥阻塞
  7. Kubernetes 容器编排
  8. java 基础知识巩固_Java基础巩固——《Java核心技术基础·卷一:基础知识》
  9. 根据经纬度计算范围_地理计算专题(上)
  10. python小细节之else