python学习(一)django orm多表查询

python学习(一)django orm多表查询

多表查询

一般的多表查询都是直接建立一个多对多关系

class Books(models.Model):
    users = models.ManyToManyField(User, related_name='t_books', blank=True)
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

比如说上面的额代码,这样就会创建一个book和user的关联表,但是有些复杂场景,关联表中不仅仅有两个表的主键,
还有一些其他个性化属性,这个时候就需要单独写一个class来声明多对多关系,如下

class Assets(models.Model):
    users = models.ForeignKey(User, related_name='t_assets', null=True, on_delete=models.CASCADE)
    books = models.ForeignKey(Policy, related_name='t_assets', on_delete=models.CASCADE)
    host = models.ForeignKey(Host, related_name='t_assets', null=True, on_delete=models.CASCADE)
    title=models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class Books(models.Model):
    name = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

这个时候列举一些查询场景

1、根据books中的属性来查询用

Books.objects.filter(name="aaa")

2、根据assets中的title来查询books,这个时候就需要用到related_name属性来查询,并且需要使用双下划线

Books.objects.filter(t_assets__title="aaa")
#模糊查询
Books.objects.filter(t_assets__title__icontains="aaa")

也可以查询assets然后反向查询

_books=list()
aa=Assets.objects.filter(title="aaa").all()
for a in aa:
   _books.append(a.books)

3、根据user类中的name查询books

Books.objects.filter(t_assets__users__name="aaa")

4、多字段模糊匹配,这个时候就需要用到django提供的Q类来封装查询语句

Books.objects.filter(Q(name__icontains=search) | Q(t_assets__title__icontains=search) | Q(
                t_assets__users__name__icontains=search))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值