Django中关系表的应用

Django存储模型是依赖于数据库的,作为数据库中很基础的应用:表关联,Django也有较为完善的机制,下面我们先来梳理一下在构建关联的表时的一些细节。

class UserGrade(models.Model):
    table = models.CharField(max_length=50 ,verbose_name="商品类",primary_key=True)
    image = models.ImageField(upload_to='')                             #保存图片
    imgSize2 = models.IntegerField(verbose_name="大小")                   #图片大小
    imgPath2 = models.CharField(max_length=128, verbose_name="图片路径")   #图片途径


class User(models.Model):
    detail = models.CharField(max_length=500)                           #图片信息
    imgName = models.CharField(max_length=50)                           #图片名称
    imgSize = models.IntegerField(verbose_name="大小")                   #图片大小
    imgPath = models.CharField(max_length=128, verbose_name="图片路径")   #图片途径
    imgType = models.CharField(max_length=32, verbose_name="类型")       #图片类型
    img = models.ImageField(upload_to='')                               #存储图片
    goodPrice=models.FloatField(verbose_name="价格")                     #商品价格
    goodType=models.ForeignKey("UserGrade",related_name='snippet', null=True,on_delete=models.CASCADE)    #关联外键
    def __unicode__(self):
        return "%s" % '%d'%(self.detail,self.goodPrice)

我先定义两个模型User(子表)和UserGrade(主表),两个模型在结构上与一般的构建流程没什么不同,仅仅多了一个定义外键的,关键也在于这个外键

goodType=models.ForeignKey("UserGrade",related_name='snippet', null=True,on_delete=models.CASCADE)    #关联外键

“UserGrade” 关联的模型,主表
related_name=‘snippet’ 指定这个子表在主表中对应的外键属性(重要)
这个是我们通过主表获得子表信息的关键

#首先获得UserGrade模型中外键指向的表中对象:
 
Grade = UserGrade.objects.all() 
 
#然后通过子表中自定义的外键获取子表的所有信息:
 
Users = Grade.snippet.all() 

到这里关于关联表如何提取数据我们已经有了大致的思路,而关于如何提交稍微有一些技巧。
我是以"multipart/form-data"形式提交的数据,这里我仅仅列出view.py中定义的提交数据的方法,来对关联外键的模型数据如何提交做一个讲解。


def upload2(request):

    if request.method == 'POST':
        base_url = "http://" + request.META["HTTP_HOST"] + "/"
        uf = UserForm(request.POST,request.FILES)
        if uf.is_valid() :
            #获得表单数据
            detail= uf.cleaned_data['detail']           #图片绑定信息
            img = uf.cleaned_data['img']                #图片文件
            goodPrice = uf.cleaned_data['goodPrice']    #商品价格
            #货物数据
            imgName=img.name                            #图片名字
            imgSize=img.size                            #图片大小
            imgPath=base_url+'static/media/'+imgName    #图片路径
            imgType=os.path.splitext(imgName)[1]        #图片类型

            table=uf.cleaned_data['table']              #标签:主键
            image = uf.cleaned_data['imgTab']           #图片文件
            #分类数据
            imgName2=image.name                            #图片名字
            imgSize2=image.size                            #图片大小
            imgPath2=base_url+'static/media/'+imgName2     #图片路径

            #添加到数据库
            try: 
                waijian = UserGrade.objects.get(table=table)
            except:
                usergrade=UserGrade.objects.create(table=table,image=image,
                                                   imgSize2=imgSize2,imgPath2=imgPath2)
                usergrade.save()
                waijian = UserGrade.objects.get(table=table)

            user = User.objects.create(detail= detail,img=img,
                                       goodPrice=goodPrice,imgName=imgName,
                                       imgSize= imgSize,imgPath=imgPath,
                                       imgType=imgType,goodType=waijian)
            user.save()
            return HttpResponse('上传成功')
    else:
        uf = UserForm()
        return render(request,'02.html',context= {'uf':uf})

这里我不是单独每个模型进行提交而是采用了实例化外键来对数据进行提交,先判断UserGrade是否存在相对应的分类标签,
若存在则直接获取这个实例
waijian = UserGrade.objects.get(table=table),
若不存在,则在UserGrade创建相应的分类信息,再获取这个实例

usergrade=UserGrade.objects.create(table=table,image=image,imgSize2=imgSize2,imgPath2=imgPath2)
usergrade.save()
waijian = UserGrade.objects.get(table=table)

创建完实例后,对User模型数据的录入,便可直接使用该实例:

user = User.objects.create(detail= detail,img=img,goodPrice=goodPrice,imgName=imgName,imgSize=imgSize,imgPath=imgPath,
                           imgType=imgType,goodType=waijian)

goodType=waijian 这样便可以完成User信息的录入。
关于返回模型数据可以采用上文提到的关联表数据的获取来完成,也可以通过rest_framework框架直接返回json形式的数据,当然这个也需要详细的介绍,我们放在接下来的文章中介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值