1. 程式人生 > >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))