python學習(一)django orm多表查詢
阿新 • • 發佈:2018-11-27
###多表查詢 一般的多表查詢都是直接建立一個多對多關係
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))