1.ORM介绍

  ORM是“对象-关系-映射”的简称

映射关系:

  mysql---------Python

  表名----------类名

  字段----------属性

  表记录--------实例化对象

ORM功能:

  操作表:创建,修改,删除

  操作数据行:增删改查

此外django没办法帮我们创建数据库,只能自己创建完后,再让django去链接

2.相关配置

如果要将模型转化为mysql数据库中的表,需要在setting中配置:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME':'bms', # 要连接的数据库,连接前需要创建好
  5. 'USER':'root', # 连接数据库的用户名
  6. 'PASSWORD':'', # 连接数据库的密码
  7. 'HOST':'127.0.0.1', # 连接主机,默认本级
  8. 'PORT':3306, # 端口 默认3306
  9. }
  10. }

# 注意

一定要提前创建好一个数据库,像上面我给的是bms,则数据库中必须提前存在这个表格

需要提前删除掉自带的DATABASES,这是django自带的轻量级数据库db.sqlite3

设置完后,再启动django项目前,需要激活mysql。如果存在报错no module named MySQLdb ,

我们在项目名文件下的__init__里写入

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

 如果还有报错

  1. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None
  2. 通过查找路径C:\Programs\Python\Python36-32\Lib\site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql
  3. 这个路径里的文件把
  4. if version < (1, 3, 3):
  5. raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
  6. 注释掉

 最后通过两条数据库迁移命令即可在指定的数据库中创建表 (终端启动mysql运行这两条命令):

  1. python manage.py makemigrations # 创建脚本
  2. python manage.py migrate    # 迁移数据

 此外,还要确保setting文件中的INSTALLED_APPS写入我们创建的app名称,我这里给的名字是app01

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. 'app01.apps.App01Config',
  9. ]

如果想打印orm转换过程中的sql,需要在setting中进行如下配置:

  1. LOGGING = {
  2. 'version': 1,
  3. 'disable_existing_loggers': False,
  4. 'handlers': {
  5. 'console':{
  6. 'level':'DEBUG',
  7. 'class':'logging.StreamHandler',
  8. },
  9. },
  10. 'loggers': {
  11. 'django.db.backends': {
  12. 'handlers': ['console'],
  13. 'propagate': True,
  14. 'level':'DEBUG',
  15. },
  16. }
  17. }  

3.启动模型

 第一步在models.py中创建模型

  1. from django.db import models
  2. # Create your models here.
  3.  
  4. class Book(models.Model):
  5. nid = models.AutoField(primary_key=True)
  6. title = models.CharField(max_length=30)
  7. publishDate = models.DateField()
  8. author = models.CharField(max_length=30)
  9. price = models.DecimalField(max_digits=5,decimal_places=2) # 5位,保留2位小数

第二步在setting中把原生的那个DATABASE数据删除,把我们的DATABASE内容复制上

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME':'bms', # 要连接的数据库,连接前需要创建好
  5. 'USER':'root', # 连接数据库的用户名
  6. 'PASSWORD':'', # 连接数据库的密码
  7. 'HOST':'127.0.0.1', # 连接主机,默认本级
  8. 'PORT':3306, # 端口 默认3306
  9. }
  10. }

第三步:在项目名文件下的__init__里写入

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

第四步:终端运行同步语句

  1. python manage.py makemigrations
  2. python manage.py migrate

3.1相关字段

  1. '''
  2.  
  3. <1> CharField
  4. 字符串字段, 用于较短的字符串.
  5. CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
  6.  
  7. <2> IntegerField
  8. #用于保存一个整数.
  9.  
  10. <3> FloatField
  11. 一个浮点数. 必须 提供两个参数:
  12.  
  13. 参数 描述
  14. max_digits 总位数(不包括小数点和符号)
  15. decimal_places 小数位数
  16. 举例来说, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
  17.  
  18. models.FloatField(..., max_digits=5, decimal_places=2)
  19. 要保存最大值一百万(小数点后保存10位)的话,你要这样定义:
  20.  
  21. models.FloatField(..., max_digits=19, decimal_places=10)
  22. admin 用一个文本框(<input type="text">)表示该字段保存的数据.
  23.  
  24. <4> AutoField
  25. 一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
  26. 自定义一个主键:my_id=models.AutoField(primary_key=True)
  27. 如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.
  28.  
  29. <5> BooleanField
  30. A true/false field. admin 用 checkbox 来表示此类字段.
  31.  
  32. <6> TextField
  33. 一个容量很大的文本字段.
  34. admin 用一个 <textarea> (文本区域)表示该字段数据.(一个多行编辑框).
  35.  
  36. <7> EmailField
  37. 一个带有检查Email合法性的 CharField,不接受 maxlength 参数.
  38.  
  39. <8> DateField
  40. 一个日期字段. 共有下列额外的可选参数:
  41. Argument 描述
  42. auto_now 当对象被保存时,自动将该字段的值设置为当前时间.通常用于表示 "last-modified" 时间戳.
  43. auto_now_add 当对象首次被创建时,自动将该字段的值设置为当前时间.通常用于表示对象创建时间.
  44. (仅仅在admin中有意义...)
  45.  
  46. <9> DateTimeField
  47. 一个日期时间字段. 类似 DateField 支持同样的附加选项.
  48.  
  49. <10> ImageField
  50. 类似 FileField, 不过要校验上传对象是否是一个合法图片.#它有两个可选参数:height_field和width_field,
  51. 如果提供这两个参数,则图片将按提供的高度和宽度规格保存.
  52. <11> FileField
  53. 一个文件上传字段.
  54. 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径. 这个路径必须包含 strftime #formatting,
  55. 该格式将被上载文件的 date/time
  56. 替换(so that uploaded files don't fill up the given directory).
  57. admin 用一个<input type="file">部件表示该字段保存的数据(一个文件上传部件) .
  58.  
  59. 注意:在一个 model 中使用 FileField ImageField 需要以下步骤:
  60. 1)在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件.
  61. (出于性能考虑,这些文件并不保存到数据库.) 定义MEDIA_URL 作为该目录的公共 URL. 要确保该目录对
  62. WEB服务器用户帐号是可写的.
  63. 2 在你的 model 中添加 FileField ImageField, 并确保定义了 upload_to 选项,以告诉 Django
  64. 使用 MEDIA_ROOT 的哪个子目录保存上传文件.你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT).
  65. 出于习惯你一定很想使用 Django 提供的 get_<#fieldname>_url 函数.举例来说,如果你的 ImageField
  66. 叫作 mug_shot, 你就可以在模板中以 {{ object.#get_mug_shot_url }} 这样的方式得到图像的绝对路径.
  67.  
  68. <12> URLField
  69. 用于保存 URL. verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在( URL是否被有效装入且
  70. 没有返回404响应).
  71. admin 用一个 <input type="text"> 文本框表示该字段保存的数据(一个单行编辑框)
  72.  
  73. <13> NullBooleanField
  74. 类似 BooleanField, 不过允许 NULL 作为其中一个选项. 推荐使用这个字段而不要用 BooleanField null=True 选项
  75. admin 用一个选择框 <select> (三个可选择的值: "Unknown", "Yes" "No" ) 来表示这种字段数据.
  76.  
  77. <14> SlugField
  78. "Slug" 是一个报纸术语. slug 是某个东西的小小标记(短签), 只包含字母,数字,下划线和连字符.#它们通常用于URLs
  79. 若你使用 Django 开发版本,你可以指定 maxlength. maxlength 未指定, Django 会使用默认长度: 50. #在
  80. 以前的 Django 版本,没有任何办法改变50 这个长度.
  81. 这暗示了 db_index=True.
  82. 它接受一个额外的参数: prepopulate_from, which is a list of fields from which to auto-#populate
  83. the slug, via JavaScript,in the object's admin form: models.SlugField
  84. (prepopulate_from=("pre_name", "name"))prepopulate_from 不接受 DateTimeFields.
  85.  
  86. <13> XMLField
  87. 一个校验值是否为合法XML的 TextField,必须提供参数: schema_path, 它是一个用来校验文本的 RelaxNG schema #的文件系统路径.
  88.  
  89. <14> FilePathField
  90. 可选项目为某个特定目录下的文件名. 支持三个特殊的参数, 其中第一个是必须提供的.
  91. 参数 描述
  92. path 必需参数. 一个目录的绝对文件系统路径. FilePathField 据此得到可选项目.
  93. Example: "/home/images".
  94. match 可选参数. 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名.
  95. 注意这个正则表达式只会应用到 base filename 而不是
  96. 路径全名. Example: "foo.*\.txt^", 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif.
  97. recursive可选参数.要么 True 要么 False. 默认值是 False. 是否包括 path 下面的全部子目录.
  98. 这三个参数可以同时使用.
  99. match 仅应用于 base filename, 而不是路径全名. 那么,这个例子:
  100. FilePathField(path="/home/images", match="foo.*", recursive=True)
  101. ...会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
  102.  
  103. <15> IPAddressField
  104. 一个字符串形式的 IP 地址, (i.e. "24.124.1.30").
  105. <16> CommaSeparatedIntegerField
  106. 用于存放逗号分隔的整数值. 类似 CharField, 必须要有maxlength参数.
  107.  
  108. '''  

3.2相关参数  

  1. (1)null
  2.  
  3. 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.
  4.  
  5. (1)blank
  6.  
  7. 如果为True,该字段允许不填。默认为False
  8. 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
  9. 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
  10.  
  11. (2)default
  12.  
  13. 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
  14.  
  15. (3)primary_key
  16.  
  17. 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
  18. Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
  19. 否则没必要设置任何一个字段的primary_key=True
  20.  
  21. (4)unique
  22.  
  23. 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
  24.  
  25. (5)choices
  26. 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。

4.添加表记录

  1. # 方式一:
  2. book = Book(title="牛虻",publishDate="2005-5-5",author="莫言",price=18)
  3. book.save()
  4. # 方式二(推荐):返回的是记录对象
  5. Book.objects.create(title="NARUTU",publishDate="2014-2-5",author="bob",price=58)

# 记住:这里添加表记录是一一对应的关系,必须title='',author='',这个后期添加表数据老容易忘

5.查询表记录

查询相关API

  1. <1> all(): 查询所有结果
  2.  
  3. <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
  4.  
  5. <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
  6. 如果符合筛选条件的对象超过一个或者没有都会抛出错误。
  7.  
  8. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
  9.  
  10. <5> order_by(*field): 对查询结果排序
  11.  
  12. <6> reverse(): 对查询结果反向排序
  13.  
  14. <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
  15.  
  16. <9> first(): 返回第一条记录
  17.  
  18. <10> last(): 返回最后一条记录
  19.  
  20. <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
  21.  
  22. <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
  23. model的实例化对象,而是一个可迭代的字典序列
  24. <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
  25.  
  26. <14> distinct(): 从返回结果中剔除重复纪录  

再补充两个相关API:

  1. <14> only():        仅取表中的数据
  2.  
  3. <15> defer(): 映射中排除某些数据  

这两个比较特殊,和value很相似,value返回的是ValuesQuerySet,而defer返回的是QuerySet对象

only和defer不仅能获取它包含的指定字段,也能查取其它字段,defer也是一样,不过会额外执行一次查询,影响效率

两者区别:only很多程度上和defer是同一类的东西,可以理解为defer的相反函数,如Author中存在A,B两个字段,则Author.objects.defer("A")和Author.objects.defer("B"),这两条语句就是等价的

相关用法:

  1. a_q = Author.objects.all().defer("name")
  2. b_q = Author.objects.all().only("name")
  3. print(a_q)
  4. print(b_q)
  5. # 两者值一样,但是打印a_q的时候会多查询一次

这里对以上结果类型进行总结,明确结果类型在对数据的提取过程中显得尤为重要,如何把queryset类型转换成obj类型,在通过obj得到需要的数据,这是重中之重

  1. 查询
  2. 1 Book.objects.all() # queryset类型
  3. 2 Book.objects.filter(title="三体") # queryset类型
  4. 3 Book.objects.exclude(title="三体") # queryset类型
  5.  
  6. 3 Book.objects.first() # obj
  7. 4 Book.objects.last() # obj
  8. 5 Book.objects.all()[0] # obj 切片
  9. 6 Book.objects.get() # obj
  10. ##########################################################
  11. 7 queryset.order_by() # 返回值还是queryset
  12. 8 queryset.reverse() # 反转,返回值还是queryset
  13. 9 queryset.count() # 返回值int,query的终止函数
  14. 10 queryset.exist() # 返回值布尔值
  15. #########################################################
  16. 11 queryset.values("") # 返回值也是queryset
  17. 12 queryset.valueslist("")
  18. 13 queryset.values
  19. 14 Book.objects.distinct("")  

演示代码

  1. def query(request):
  2. #1 查询所有,返回的是一个queryset数据类型对象,类似于 [obj,obj,.....]
  3. book_lis = Book.objects.all()
  4. for temp in book_lis:
  5. print(temp.title)
  6.  
  7. #2 返回的是一个queryset数据类型对象,[model_obj,.....]
  8. ret = Book.objects.filter(price=58)
  9. for obj in ret:
  10. print(obj.title)
  11.  
  12. #3 first,last,queryset支持切片操作
  13. obj = Book.objects.all().first()
  14. obj = Book.objects.all().last()
  15. obj = Book.objects.all()[-1]
  16. print(obj)
  17.  
  18. #4 count查询表中有几条数据,返回int类型
  19. obj = Book.objects.count()
  20. print(obj)
  21.  
  22. #5 get返回的就是一个model对象(有且只有一个结果的是由才有意义)
  23. obj = Book.objects.get(id=1)
  24. obj = Book.objects.get(title="牛虻")
  25. print(obj.author)
  26.  
  27. #6 exclude 排除,等同于filter
  28. # 查看名字bob外其他人的相关数据
  29. obj = Book.objects.exclude(author="bob")
  30. for i in obj:
  31. print(i.author,i.title,i.price)
  32.  
  33. #7 order_by,排序
  34. obj = Book.objects.all().order_by("price").reverse()
  35. print(obj)
  36.  
  37. #8 exists
  38. ret = Book.objects.all().exists()
  39. if ret:print("Ok")
  40.  
  41. #9 values
  42. book_list = Book.objects.all().values("title", "price")
  43. print(book_list)
  44.  
  45. # < QuerySet
  46. # [
  47. # {'title': '牛虻', 'price': Decimal('18.00')},
  48. # {'title': 'NARUTU', 'price': Decimal('58.00')},
  49. # {'title': 'NARUTU', 'price': Decimal('58.00')}
  50. # ]
  51. # >
  52.  
  53. #10 values_list # 注意两者区别
  54. book_list = Book.objects.all().values_list("title", "price")
  55. print(book_list)
  56. # < QuerySet
  57. # [
  58. # ('牛虻', Decimal('18.00')),
  59. # ('NARUTU', Decimal('58.00')),
  60. # ('NARUTU', Decimal('58.00'))
  61. # ]
  62. # >
  63.  
  64. #11 distinct,去重
  65. obj = Book.objects.all().values("author").distinct()
  66. print(obj)
  67.  
  68. return HttpResponse("查询成功")

模糊查询,注意是双下划线

  1. Book.objects.filter(price__in=[100,200,300]) # 获取价格等于100,200,300的数据
  2. Book.objects.exclude(price__in=[100,200,300]) # not in
  3. Book.objects.filter(price__gt=100) # 大于100
  4. Book.objects.filter(price__lt=100) # 小于100
  5. Book.objects.filter(price__range=[100,200]) # 价格范围在100~200之间
  6. Book.objects.filter(title__contains="python")  
  7. Book.objects.filter(title__icontains="python") # 不区分大小写
  8. Book.objects.filter(title__startswith="py") # 以py开头
  9. Book.objects.filter(pub_date__year=2012)

# 注意这里大于等于是用price_gte=100

# publishDate__year =2017,publishDate__month = 10    查看2017年10月份的数据

6.修改表记录

  1. Book.objects.filter(id=2).update(title="滚石",price=23)

7.删除表记录  

  1. def dels(request,nid):
  2. Book.objects.filter(id=nid).delete()
  3. return redirect("test") 

查询练习

  1. 1 查询老男孩出版社出版过的价格大于200的书籍
  2. Book.objects.filter(price__gt=200,publish="老男孩出版社",is_pub=True)
  3.  
  4. 2 查询20178月出版的所有以py开头的书籍名称
  5. Book.objects.filter(title__startswith="py",pub_date__year=2017,pub_date__month=8)
  6.  
  7. 3 查询价格为50,100或者150的所有书籍名称及其出版社名称
  8. Book.objects.filter(price__in=[50,100,150]).values("title","publish")
  9.  
  10. 4 查询价格在100200之间的所有书籍名称及其价格
  11. Book.objects.filter(price__range=[100,200]).values("title","price")
  12.  
  13. 5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
  14. Book.objects.filter(publish="人民出版社").order_by("prcie").reverse().values("prcie").distinct()
  15.  
  16. 6 查询价格大于200的书籍的个数
  17. Book.objects.filter(price__gt=200).count()
  18.  
  19. 7 查询价格不等于100的所有书籍
  20. Book.objects.exclude(prcie=100)
  21.  
  22. 8 查询苹果出版社出版的书籍中的第3-7本(前提存在足够数量的书籍)
  23. Book.objects.filter(publish="苹果出版社")[2:7]

django ORM单表操作的更多相关文章

  1. django框架基础-ORM单表操作-长期维护

    ###############    单表操作-添加数据    ################ import os if __name__ == '__main__': os.environ.set ...

  2. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  3. day59——orm单表操作

    day59 orm单表操作 对象关系映射(object relational mapping) orm语句 -- sql -- 调用pymysql客户端发送sql -- mysql服务端接收到指令并执 ...

  4. 17-2 orm单表操作和多表操作

    参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1. 查询 1. 查所有 models.Publisher. ...

  5. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  6. day52:django:ORM单表/多表操作

    目录 1.ORM 2.ORM单表增删改查 13个必知必会的查询接口 filter基于双下划线的模糊查询 3.ORM多表增删改查 ORM 什么是ORM? ORM(object relational ma ...

  7. Django之模型---ORM 单表操作

    以上一随笔中创建的book表为例讲解单表操作 添加表记录 方式一 # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象 book_obj=Book.o ...

  8. orm单表操作

    二.orm简介 ORM:object relation mapping (ORM是“对象-关系-映射”的简称) MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦, ...

  9. django第8天(在测试文件中运行django项目|单表操作)

    django第8天 在测试文件中运行django项目 1.将项目配置文件数据库该为mysql,修改配置信息 PORT = '127.0.0.1' DATABASES = { 'default': { ...

随机推荐

  1. selenium-webdriver(python) (十四) -- webdriver原理(转)

    之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据:觉得这个功能很强大,可以帮助理 ...

  2. Python操作列表

    1.List Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  3. Boxes in a Line UVA - 12657 (双向链表)

    题目链接:https://vjudge.net/problem/UVA-12657 题目大意:输入n,m  代表有n个盒子 每个盒子最开始按1~n排成一行  m个操作, 1 x y  :把盒子x放到y ...

  4. 在SQL Server中创建用户角色及授权(使用SQL语句)

    1. 首先在 SQL Server 服务器级别,创建登陆帐户(create login) --创建登陆帐户(create login) create login dba with password=' ...

  5. Java基础06-条件选择语句

    1.switch多分支结构 import java.util.Scanner; public class Test1{ public static void main(String[] args){ ...

  6. 性能测试工具LoadRunner32-LR之windows性能监控Perfmon

    Perfmon是啥? Perfmon提供了图表化的系统性能实时监视器.性能日志和警报管理,可以用于监视CPU使用率.内存使用率.硬盘读写速度.网络速度等 性能分析方法 内存分析方法 内存分析用于判断系 ...

  7. 性能测试工具Jmeter01-简介

    Jmeter介绍: Apache JMeter是Apache组织的开放源代码项目,是一个纯Java桌面应用,用于压力测试和性能测试.最初被设计用于Web应用测试后来扩展到其它测试领域 Jmeter有啥 ...

  8. socket编程(一)

    因为下载器涉及到socket的知识,就花了一天学习了.因为时间原因分成几部分.(这里记录上的是基于Windows平台的) #include <stdio.h> #include <w ...

  9. jQuery源代码学习笔记_01

    如何获取jQuery源代码 1.可以从GitHub上下载到没有合并和压缩的源代码 2.如果要查看兼容IE6-8的版本,请选择1.x-master分支 3.可以使用git clone也可以使用downl ...

  10. pat04-树9. Path in a Heap (25)

    04-树9. Path in a Heap (25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue Insert ...