前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-多对多查询

Django实战-多对多查询

作者头像
小团子
发布2019-10-15 10:20:29
2.9K0
发布2019-10-15 10:20:29
举报
文章被收录于专栏:数据云团数据云团

Django实战-ORM 数据库配置

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

举例:现有两张表,Store表和Category表。Store表中的字段有商家名称,商家详情信息等信息。而Category表中有商品类别信息。可以知道一个商家可以有多个商品类别,一个类别中也可以包含多个商品,所以这两张表的关系就是多对多的关系。

代码语言:javascript
复制
from django.db import models
代码语言:javascript
复制
class Goods(models.Model):#商品
    name = models.CharField(max_length=20)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    gc = models.ForeignKey("Category", null=True, on_delete=models.SET_NULL)#gc为外键,类别表为母表

class Category(models.Model):#类别
    name = models.CharField(max_length=20)

class Store(models.Model):#商家
    name = models.CharField(max_length=30)
    detail = models.TextField(blank=True, null=True)
    sc = models.ManyToManyField("Category")#与类别表进行多对多关联

代码语言:javascript
复制
# 添加商家
Store.objects.create(name="商家A", detail="物美价廉,限时抄底折扣")
Out[2]: <Store: Store object>

Store(name="商家B", detail="大促销").save()
代码语言:javascript
复制
# 添加类别
Category.objects.create(name="电脑整机")
<Category: Category object>

Category(name="文具").save()

多对多重点在于关系表的对应关系变更

代码语言:javascript
复制
# 创建商家C添加全部分类
Store.objects.create(name="商家C").sc.add(*(Category.objects.all()))#如果商户已存在则把create改成get

store = Store.objects.get(name="商家C")
store.sc=(Category.objects.all())
store.save()
代码语言:javascript
复制
# 创建商家D添加指定分类
store = Store.objects.create(name="商家D")
category = Category.objects.filter(name__in=["电脑整机","文具"])#单个改成get,全部改成all
store.sc.add(*category)#add是追加模式
store.sc.clear()#清空此商家的商品
代码语言:javascript
复制
#让指定商品分类添加指定的商家,反向查询
store = Store.objects.create(name="商家E")
category = Category.objects.get(name="电脑整机")
category.store_set.add(store)
代码语言:javascript
复制
# 让所有商家都添加这个分类
stores = Store.objects.all()
category = Category.objects.get(name="电脑整机")
category.store_set.add(*stores)
代码语言:javascript
复制
#让所有商家去除这个分类
category.store_set.clear()
# 删除store_set的所有商家
category.store_set.all().delete()
#只有子表才有"子表名小写_set"的写法,得到的是一个QuerySet集合,后边可以接.add(),.remove(),.update(),.delete(),.clear()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档