Django-----多对多

多对多(二级分类,商品表,)
字段--名字---价格-----库存---简介-----详情----图片-----销售量----评论数量-----二级分类的外键----评价

下拉菜单选值俩个--多个---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
posted @ 2020-02-29 13:29  Mr-刘  阅读(138)  评论(0编辑  收藏  举报