码迷,mamicode.com
首页 > 其他好文 > 详细

Django ORM 一对多操作

时间:2018-09-09 23:10:08      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:名称   赋值   操作   def   lte   integer   获取   自动   对象   

创建表

# 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‘)  # 创建外键关联到Publish表的id字段,django会自动将该名称改为publish_id  
# 如果这样写 publish = models.ForeighKey(Publish) 括号内无引号,则必须将Publish类放到Book类的上面
  def __str__(self):     return self.name  # 打印实例对象时显示为self.name

class 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]  
  
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)  # python
print(book_obj.publish)  # Publish object  是与book对应的Publish的对象
print(type(book_obj.publish))  # <class ‘app01.models.Publish‘>

# 获取所有人民出版社的书(通过对象)
# 通过书来找出版社(子表找主表)正向查询
publish_obj = Publish.objects.get(‘人民出版社‘)[0]
ret = book_obj=Book.objects.filter(publish=publish_obj)
# 通过出版社来找书 (主表找子表) 反向查询
publish_obj = Publish.objects.get(‘人民出版社‘)[0]
ret = publish_obj.book_set.all()  # 通过publish对象去找book表中其所有对应的数据 (book_set对就的就是子表book的书的集合)

# 通过双下划线查询 (可以用在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‘)

Django ORM 一对多操作

标签:名称   赋值   操作   def   lte   integer   获取   自动   对象   

原文地址:https://www.cnblogs.com/dangrui0725/p/9615641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!