多对多(二级分类,商品表,)
字段--名字---价格-----库存---简介-----详情----图片-----销售量----评论数量-----二级分类的外键----评价
下拉菜单选值俩个--多个---multiple
商品表:Class goods(models.Models):
名字: name = models.Charfield(max_length=50)
价格: price = models.DecimalField(max_digits=10,decimal_place=2)
描述: desc = models.Charfield(max_length=200)
详情: content = models.Textfield()
图片: image_url = models.Charfield(max_length=255)
销售量: sales = models.IntegerField(default=0)
评论数量:comment_count = models.Integer(default=0)
#二级分类外键------->多对多
外键: Cate_list = models.ManyToManyField(Twocate)
显示表名
class Meta:元信息: db_table = 'goods'
简介:ManyToMany------数据迁移成功后会单独生成一张多对多的表
如若要添加商品且要多处使用添加时的语法为-----两种方法
一、
for i in cid:
c = Twocate.objects.filter(id=i).first()
goods.cate_list.add©
二、
一次性写入
cate_list = Twocate.objects.filter(id__in=cid)
goods.cate_list.set(cate_list)
goods.save()
例子:代码演示
image_url_name = datetime.now().strftime('%Y%m%d%H%M%S%f')+image_url.name
f = open(os.path.join(settings.STATICFILES_DIRS[0],'upload',image_url_name),'wb')
for i in image_url.chunks():
f.write(i)
f.close()
goods=Goods(name=name,price=price,stock=stock,desc=desc,content=content,image_url="/static/upload/"+image_url_name)
goods.save()
需存入表里一次,再执行二次多对多操作
for i in cid:
c = Twocate.objects.filter(id=i).first()
goods.cate_list.add©
# 一次性写入
# cate_list = Twocate.objects.filter(id__in=cid)
# goods.cate_list.set(cate_list)
# goods.save()
### 多对多的基本查询用法
---------------------
创建多对多表
# 1、课程表 多对多表操作
class corsur(models.Model):
name = models.CharField(max_length=32)
# 加''表示指定的表,不管指定的表在那个位置。
stu = models.ManyToManyField(to='Student')
class Meta:
db_table = 'corsur'
# 2、书写基础逻辑查询
# 多对多查询
# 学生选择了哪几门课程
def show2(request):
student = Student.objects.filter(id=1).first()
print(student.name)
# 正向查询,学生选择了哪几门的课程
print([i.name for i in student.corsur_set.all()])
return HttpResponse('OK')
******假如在学生表,跟课程表中外建设置在课程表,而这时要用学生表进行关联查询、
,就需要内置的属性set进行查询
# 课程被哪些学生选择了
def show3(request):
cc = corsur.objects.filter(id=4).first()
print(cc.name)
# 反向查询,是指课程被哪些学生选定了
cc_list = cc.stu.all()
print([i.name for i in cc_list])
return HttpResponse('OK')
====================================================================================================
# 多对多反序列化添加
# 球员表
class Player(Base,models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=7,decimal_places=2)
class Meta:
db_table = 'player'
#球队表
class Team(Base,models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=7,decimal_places=2)
pro_for = models.ManyToManyField(to="Player",related_name='teams')
class Meta:
db_table = 'team'
--------------------------------------------------------------------------------------------------
在反序列化py里
# 反序列化添加球员表
class PlayerUnserializer(serializers.Serializer):
# 前端获取的字段==也是表里获取字段
name = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=7,decimal_places=2)
tid = serializers.IntegerField()
def create(self,data):
# 因为表里没有该字段所有pop弹出
tid = data.pop('tid')
# 将数据添加入库
playobj = Player.objects.create(**data)
# 查询出该字段的id
play_id = playobj.id
# 用tid去她该字段里查询
teamobj = Team.objects.filter(id=tid).first()
# 对 多对多的字段进行添加
teamobj.pro_for.add(play_id)
return teamobj