Django的Orm操作数据库
Django的Orm操作数据库
双下划线的跨表查询
数据库模型
class Book(models.Model): nid = models.AutoField(primary_key=True) # 自增id(可以不写,默认会有自增id) title = models.CharField(max_length=32) publishDdata = models.DateField() # 出版日期 price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留两位小数 #一个出版社有多本书,关联字段要写在多的一方 # 不用命名为publish_id,因为django为我们自动就加上了_id publish = models.ForeignKey("Publish") #foreignkey(表名)建立的一对多关系 # publish是实例对象关联的出版社对象 authorlist = models.ManyToManyField("Author") #建立的多对多的关系 def __str__(self): #__str__方法使用来吧对象转换成字符串的,你返回啥内容就打印啥 return self.title class Publish(models.Model): #不写id的时候数据库会自动给你增加自增id name =models.CharField(max_length=32) addr = models.CharField(max_length=32) def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() class AuthorDeital(models.Model): tel = models.IntegerField() addr = models.CharField(max_length=32) author = models.OneToOneField("Author") #建立的一对一的关系
跨表查询需要使用两个下划线来链接(model)间关联字段的名称,直到最终连接到你想要的model为止。这个相当于mysql的sql语句用join链接一样,可以在django的settings中设置。
一对多查询
1.查询人民出版社出版过的所有的书的价格和名字
# 基于双下划线的方式查询1================一对多 # 第一种查法 ret = models.Publish.objects.filter(name="人民出版社").values("book__price","book__title") // 反向查询时,表名__字段,例如:book__price print(ret) # 第二种查法 ret2 = models.Book.objects.filter(publish__name="人民出版社").values("price","title") // 正向查询时,外键字段__关联表的字段,例如:publish__name print(ret2)
2.查询手机号以151开头的作者出版过的所有书的名称以及出版社的名称
# 方式一: author_obj = models.AuthorDeital.objects.filter(tel__startswith="151").first() print(author_obj.author.book_set.all().values("title","publish__name")) # 方式二: ret = models.Book.objects.filter(authorlist__author_deital__tel__startswith="151").values("title","publish__name") print(ret)