关于Django多对多关系注册admin和多对多关系查询方法

今天写一下在django开发过程中遇到的那点小坑,主要是对于“多对多关系”这个坑,当我们在models.py中声明了字段后,在admin.py中去注册,models.py的各个类没有ManyToMany关系还好,一旦有这种关系,平时用的的注册方法就不行了,下面呢,上关系图:
这里写图片描述
上图的关系有三张表,Goods是商品表,Category是分类表,Store是卖家表,一件商品理论上只有一种分类,所以采用了外键的方式声明其关系,然而分类和卖家就不一样了,例如分类中有一个分类叫做玩具类,然而卖家A可以卖玩具,卖家B可以卖玩具,这就是一对多的关系,但是反过来呢,一个卖家不可能只卖一类商品吧,卖家A可能卖玩具类,也可能卖婴幼儿用品类等等,所以类别表和卖家表是多对多的关系。我们为了在后台能够看到我们声明的字段,需要在admin.py中将models.py中的类进行注册。接下来我们将models模型注册到admin中。上图:
这里写图片描述
我们来看Storeadmin这个类,因为我们在models中声明关系的时候,这个类包含多对多关系,如果我们按照前两个类进行注册的时候,将会报错,报错如下:
这里写图片描述
这里写图片描述
大家可以在网上搜下这个报错什么意思
现在来解释下StoreAdmin类中show_sc的参数obj是什么鬼,这个是这个玩意
这里写图片描述
意思就是models.py中的Store类
声明的那个show_sc方法是个什么意思呢,先看return返回的那个列表中的内容,obj.sc.all()是获取Store类的所有sc列,然后进行循环,因为sc是Category的外键,所以可以通过sc来拿到Category类中的列 c_name,所以list_display中的show_sc的作用就相当于调用了show_sc()这个函数,返回了Category的列 c_name组成的列表,
所以:
Category表相对于Goods表,Category是母表,Goods表是子表,
Category表相对于Store表,Category是母表,Store是子表
有以下写法:
子表名小写_set”的写法,得到的是一个QuerySet集合,后边可以跟 .add(),.remove(),.update(),.delete(),.clear()
下边来讲如何针对这种关系进行增查删:
首先为Category类添加数据:
c1 = Category.objects.create(c_name=”玩具类”)
c1.save()
c2 = Category.objects.create(c_name=”家具类”)
c2.save()
c3 = Category.objects.create(c_name=”水果类”)
c3.save()

这样就为Category添加了三条数据
现在为Goods表添加数据
g1 = Goods.objects.create(g_name=”赛车”,g_price=”100”,gc = Category.objects.all()[0])
g1.save()
或者:
c1 = Category.objects.get(c_name=”玩具”)
g1 = Goods.objects.create(g_name=”赛车”,g_price=”100”,gc=c1)
g1.save()

这样就为Goods表添加了一条数据,并且给的分类为 玩具
查询Category类中 “玩具类” 下的所有商品(母表—>>子表)
c1 = Category.objects.get(c_name=”玩具”)
g1 = c1.goods_set.all()

查询指定商品属于那些类(子表—>母表)
g1 = Goods.objects.get(g_name=”赛车”)
g1_gc = g1.gc

然后为Store表添加数据(子表—->>母表)
c1 = Category.objects.get(c_name=”玩具”)
s1 = Store.objects.create(s_name=”北京少儿玩具有限公司”,s_detail=”本公司专门加工生产少儿玩具。。。。”)
c1.store_set.add(s1)
或者:
Category.objects.all()[0].store_set.add(Store.objects.create(s_name=”北京少儿玩具有限公司”,s_detail=”本公司专门加工生产少儿玩具。。。。”))
这样就添加了一条卖家名为“北京少儿玩具有限公司”,分类为“玩具”
这种是通过商品分类添加指定公司(母表—->>子表)
反过来,给公司添加指定分类:
c1 = Category.objects.create(c_name = “家居用品”)
s1 = Store.objects.create(s_name=”北京家居用品有限公司”,s_detail = “本公司专门售卖各种家居用品,大彩电小彩电大沙发小沙发。。。”)
s1.sc.add(c1)
这样就可以了

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值