首页 > 编程语言 > 详细

Python学习第131天(Django之ORM一对多操作练习)

时间:2020-07-15 01:24:33      阅读:70      评论:0      收藏:0      [点我收藏+]

创建表

# models.py

form django.db import models

class Book(models.Model):  
  # 表名book,django会自动使用项目名+我们定义的表名   # 如没有自定义主键,django会自动添加一个主键,字段名id 自增   name = models.CharField(max_length=20)  
  # 字段名name 类型 vachar(20)   price = models.IntegerField()   
  # 字段名price 类型int   pub_date
= models.DateField()   
  # 字段名pub_date 类型 date (时间戳)   publish
= models.ForeighKey(Publish,related_name=xxx)  
  # 创建外键关联到Publish表的id字段,django会自动将该名称改为publish_id  
  # 这里的publish可以代指Publish中的一行数据(name city),即Publish的一个实例对象
  # related_name=xxx 表示能过publish来找book时使用的名称,默认为book_set(反向查询时使用)
  # 如果这样写 publish = models.ForeighKey(Publish) 括号内无引号,则必须将Publish类放到Book类的上面   def __str__(self):     return self.name  
  # 打印实例对象时显示为
  self.nameclass Publish(models.Model):  name = models.CharField(max_length=32)  city = models.CharField(max_length=32)

一对多的添加

# views.py

from django.shortcuts import render
from app_name.models import *  # 导入models.py

def add(request):  # 增加数据的视图函数
  # 方式一 直接对publish_id赋值
  Book.objects.create(name=Linux基础,price=99,author=yuan,pub_date=2017-12-12,publish_id=2)  
  # 一次数据库操作,推荐   # 方式二 通过创建一个publish的对象直接对publish赋值 publish_obj
= Publish.objects.filter(name=人民出版社)[0]  
  # ==>publish_obj = Publish.objects.filter(name=人民出版社).first()   Book.objects.create(name=Linux基础,price=99,author=yuan,pub_date=2017-12-12,publish=publish_obj)  
  # 两次数据库操作   
return HttpResponse(添加成功)得出结论:1.publish_id 对应一个数字
  
  2.publish对应一个publish的实例对象

一对多的查询

# 怎么使用一对多查询呢?book_obj = Book.objects.get(name=python)print(book_obj.name)  
# pythonprint(book_obj.publish)  
# Publish object  是与book对应的Publish的对象print(type(book_obj.publish))  
# <class app01.models.Publish># 获取所有人民出版社的书(通过对象)# 通过书来找出版社(子表找主表)正向查询,
使用FK 推荐publish_obj = Publish.objects.get(人民出版社)ret = book_obj=Book.objects.filter(publish=publish_obj)
# 通过出版社来找书 (主表找子表) 反向查询 使用 子表__set 或 related_namepublish_obj = Publish.objects.get(人民出版社)[0]ret = publish_obj.book_set.all()  
# 通过publish对象去找book表中其所有对应的数据 (book_set对就的就是子表book的书的集合,通过定义FK时的参数related_name来定义这个名字) # 通过双下划线查询 (可以用在filter与values中)
  
1.获取所有人民出版社的书Book.objects.filter(publish__name=人民出版社)Publish.objects.filter(name=人民出版社).values(book__name)
  
  2.获取python这本书出版社的名字Publish.objects.filter(book__name=python)Book.objects.filter(name=python).values(publish__name)

  3.获取所有北京的出版社出过所有的书Book.objects.filter(publish__city=北京)Publish.objects.filter(city=北京).values(book__name)

今天有点懒,就这样了。

Python学习第131天(Django之ORM一对多操作练习)

原文:https://www.cnblogs.com/xiaoyaotx/p/13302953.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!