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

2019-08-02 11:07:07 浏览数 (3)

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

代码语言:javascript复制
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来声明多对多关系,如下

代码语言:javascript复制
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中的属性来查询用

代码语言:javascript复制
Books.objects.filter(name="aaa")

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

代码语言:javascript复制
Books.objects.filter(t_assets__title="aaa")
#模糊查询
Books.objects.filter(t_assets__title__icontains="aaa")

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

代码语言:javascript复制
_books=list()
aa=Assets.objects.filter(title="aaa").all()
for a in aa:
   _books.append(a.books)

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

代码语言:javascript复制
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))

0 人点赞