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号

这样我们就可以看到每个顾客购买了什么东西

最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏