1:N
使用models.ForeignKey关联
删除时同
1
: 1
获取对应元素 grade.student_set
ForeignKey
主从获取
主获取从 隐性属性 级联模型_set
student_set Manager的子类
- all
- filter
- exclude
- Manager上能使用的函数都能使用
从获取主
- 显性属性
M : N
使用models.
删除会删除指定对象和关系表中的关系映射
获取对应元素Goods和Buyer
goods. buyer_set
buyer. bgoods
买家添加buyer.bgoods.add 买家清空buyer.bgoods.clear
买家移除buyer.bgoods.remove
M:N
- 实际上最复杂
- 开发中很少直接使用多对多属性,而是自己维护多对多的关系
产生表的时候会产生单独的关系表
- 关系表中存储关联表的主键,通过多个外键实现的
- 多个外键值不能同时相等
级联数据获取
从获取主
- 使用属性,属性是一个Manager子类
主获取从
隐性属性
- 也是Manager子类,操作和从操作主完全一样
用法:
- add
- remove
- clear
- set
实践:电商模型
models:
# 消费者
class Customer(models.Model):
c_name = models.CharField(max_length=16)
# 商品
class Goods(models.Model):
g_name = models.CharField(max_length=16)
# 商品与消费者的关系为多对多
g_customer = models.ManyToManyField(Customer)
迁移数据库
发现生成了三张表
第三张表就是关系表,用来记录前两张表的唯一标识
查看关系表的DDL
产生表的时候会产生单独的关系表
- 关系表中存储关联表的主键,通过多个外键实现的
- 多个外键值不能同时相等
urls:
url('^addcustomer/', views.add_customer, name='add_customer'),
url('^addgoods/', views.add_goods, name='add_goods'),
人工智能有多恐怖:需求输入,程序的代码生成70%,只需要处理小细节即可。
views:
def add_customer(request):
c_name = request.GET.get('cname')
customer = Customer()
customer.c_name = c_name
customer.save()
return HttpResponse('创建消费者成功%d' % customer.id)
def add_goods(request):
g_name = request.GET.get('gname')
goods = Goods()
goods.g_name = g_name
goods.save()
return HttpResponse('创建商品成功 %d' % goods.id)
接着我们添加处理两者关系的函数,商品和消费者关联就是加入了购物车。
url
url('^addtocart/', views.add_to_cart, name='add_to_cart'),
views:
def add_to_cart(request):
customer = Customer.objects.last()
goods = Goods.objects.last()
print(type(goods.g_customer))
print(goods.g_customer)
return HttpResponse('添加成功')
这里print()是为了先了解g_number是什么样类型的数据
运行:
先添加消费者
再添加商品
接着绑定商品和消费者,即添加到购物车中
打印出了
ManyRelatedManager是一个类
- 是函数中定义的类
- 并且父类是一个参数
- 这种用法动态创建
用法 - add
- remove
- clear
- set
接着我们修改views:让关系添加到关系表中
def add_to_cart(request):
customer = Customer.objects.last()
goods = Goods.objects.last()
# 将一组消费者绑定到商品上
goods.g_customer.add(customer)
return HttpResponse('添加成功')
将add改成remove可以发现删除了关系
而且删除一个不存在的数据不会报错,添加一个已经存在的数据也不会报错
级联数据获取
从获取主
- 使用属性,属性是一个Manager子类
- add
- remove
- clear
- set
主获取从
隐性属性
- 也是Manager子类,操作和从操作主完全一样
customer.goods_set.add(goods)
接着我们运行多次
可以看到生成很多对应关系
现在我们要查出一个人买了什么商品
添加url:用customerid来获取用户对应的Id买了哪些商品
url('^getgoodslist/(?P<customerid>\\d+)/', views.get_goods_list, name='get_goods_list')
views:
# 通过customerid查找对应的人的商品
def get_goods_list(request, customerid):
customer = Customer.objects.get(pk=customerid)
goods_list = customer.goods_set.all()
return render(request, 'goods_list.html', context=locals())
新建goods_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>goods_list</title>
</head>
<body>
<ul>
{% for goods in goods_list %}
<li>{{ goods.g_name }}{{ goods.id }}</li>
{% endfor %}
</ul>
</body>
</html>
接着访问测试
1号顾客买的商品
2号
这样我们就可以看到每个顾客购买了什么东西
此处评论已关闭