Django 基础(四)——一对多关联表的增删改查

假设有两张表—— Category 和 Goods 。如果一种类别下有多种货物,而每种货物只属于一种类别,这两张表就构成了一对多关联关系。下文主要介绍其 Model 层搭建和增删改查操作。

一、Model 类创建
class Category(models.Model):  # 主表
    title = models.CharField(max_length=20)
    note = models.CharField(max_length=20)

    class Meta:
        db_table = 't_category'


class Goods(models.Model):  # 从表
    title = models.CharField(max_length=20, unique=True)
    price = models.FloatField()
    cate = models.ForeignKey(to=Category, on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = 't_goods' 
二、增加操作
  1. 添加主表数据(与单表添加无异)
	Category.objects.create(title='食品',note='吃')
  1. 添加从表数据(关联的主表记录已存在)
- 方式一:
	c = Category.objects.get(pk=1)
	c.goods_set.create(title='面包',price=5) #good_set是类似querySet的集合,通过这个添加从表数据
	
- 方式二:
	c = Category.objects.get(pk=1)
	Goods.objects.create(title='酸奶',price=6,cate=c) #外键字段用主表对应的Model类对象赋值
  1. 同时添加两表数据
- 方式一:
	c = Category(title='百货',note='日用品')
	g = Goods(title='胶带纸',price=3)
	c.save()
	g.save()
	c.goods_set.add(g)
	
- 方式二:
	c = Category(title='衣服',note='保暖')
	c.save()
	Goods.objects.create(title='羽绒服',price=500,cate=c)
三、删除操作
  1. 删除从表方(与单表删除)
Goods.objects.get(pk=1).delete()
  1. 删除主表方
    此时要看从表方的级联设置(on_delete),会影响到从表方。

| 选项 | 说明 |
----| ---- |-----
| CASCADE | 级联删除 |
|SET_NULL | 外键置空(如果允许空的话)|
| PROTECT | 不允许直接删除主表|
| SET_DEFAULT |需要为外键列设置默认值,默认值也应该是合法的外键值,可以在表中预留一个id |
| SET | 将外键设置为某个值,值应该是合法的外键值,可以在表中预留一个id |
| DO_NOTHING | django什么也不做,由数据库决定是否合法|

四、修改操作

先查出数据,修改属性,然后用 save() 保存到数据库。

	c = Category.objects.all()[0]
	c.note = '毛衣'
	c.save()
五、查询操作
  1. 只查单表数据(和单表查询无异)
	c = Category.objects.filter(title='百货')
	g = Goods.objects.filter(price=500)
	print(c)
	print(g)
  1. 以主表数据为条件,查询从表
- 方式一:
	c = Category.objects.get(note='毛衣')
	print(c.goods_set.all().values())

- 方式二:
	c = Category.objects.filter(note='毛衣')[0]
	print(c.goods_set.all().values())
	
- 方式三:
	g = Goods.objects.filter(cate__note='毛衣').values()
	print(g)
  1. 以从表数据为条件,查询主表
- 方式一:
	g = Goods.objects.get(price=500)
	print(g.cate.title,g.cate.note)
- 方式二:
	g = Category.objects.filter(goods__price=500).values()
	print(g) #返回一个包含字典的 QuerySet对象。
  1. 返回结果包含双方数据
	c = Category.objects.filter(goods__price=500).values('title','note','goods__title','goods__price').values()
print(c)
	g = Goods.objects.filter(price=500).values('cate__title','cate__note','title','price').values()
print(g)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值