假设有两张表—— 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'
二、增加操作
- 添加主表数据(与单表添加无异)
Category.objects.create(title='食品',note='吃')
- 添加从表数据(关联的主表记录已存在)
- 方式一:
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类对象赋值
- 同时添加两表数据
- 方式一:
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)
三、删除操作
- 删除从表方(与单表删除)
Goods.objects.get(pk=1).delete()
- 删除主表方
此时要看从表方的级联设置(on_delete),会影响到从表方。
| 选项 | 说明 |
----| ---- |-----
| CASCADE | 级联删除 |
|SET_NULL | 外键置空(如果允许空的话)|
| PROTECT | 不允许直接删除主表|
| SET_DEFAULT |需要为外键列设置默认值,默认值也应该是合法的外键值,可以在表中预留一个id |
| SET | 将外键设置为某个值,值应该是合法的外键值,可以在表中预留一个id |
| DO_NOTHING | django什么也不做,由数据库决定是否合法|
四、修改操作
先查出数据,修改属性,然后用 save() 保存到数据库。
c = Category.objects.all()[0]
c.note = '毛衣'
c.save()
五、查询操作
- 只查单表数据(和单表查询无异)
c = Category.objects.filter(title='百货')
g = Goods.objects.filter(price=500)
print(c)
print(g)
- 以主表数据为条件,查询从表
- 方式一:
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)
- 以从表数据为条件,查询主表
- 方式一:
g = Goods.objects.get(price=500)
print(g.cate.title,g.cate.note)
- 方式二:
g = Category.objects.filter(goods__price=500).values()
print(g) #返回一个包含字典的 QuerySet对象。
- 返回结果包含双方数据
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)
5442

被折叠的 条评论
为什么被折叠?



