zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    Oracle Instant Client(即时客户端) 安装与配置
    面试中经典的数据库问题
    MySQL 大表优化方案
    mysql中Timestamp,Time,Datetime 区别
    HTML学习之给div高度设置百分比不生效的问题
    textarea文本域宽度和高度width及height自动适应实现代码
    JAVA基础----java中E,T,?的区别?
    去除ArrayList集合中的重复自定义对象元素
    sql select中加入常量列
    mysql 将null转代为0
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/12382590.html
Copyright © 2011-2022 走看看