美文网首页
Django模型关联操作

Django模型关联操作

作者: 0938159669cd | 来源:发表于2018-09-12 15:56 被阅读0次

    Django中的模型与模型之间一般会存在关联关系,如以下两个表:

    # 图书模型
    class BookInfo(models.Model):
        title = models.CharField(max_length=20)
        pub_date = models.DateField()
        read_num = models.IntegerField(default=0)
        comment_num = models.IntegerField(default=0)
        is_delete = models.BooleanField(default=False)
    
    # 英雄模型
    class HeroInfo(models.Model):
        name = models.CharField(max_length=20)
        gender = models.BooleanField(default=True)
        age = models.IntegerField()
        comment = models.CharField(max_length=200)
        hbook = models.ForeignKey('BookInfo',default=None, on_delete=models.CASCADE)
        is_delete = models.BooleanField(default=False)
    

    英雄模型通过 book = models.ForeignKey('BookInfo',default=None, on_delete=models.CASCADE) 与图书模型产生关联:
    图书 -> 英雄 是一个 1对多的关系,而反过来 英雄 -> 图书 则是一个多对1的关系。

    我们可以将存放关联属性的类称之为多类,如关联两个表的属性hbook存放在HeroInfo,则HeroInfo 称为多类,相应的BookInfo被成为一类。

    存在关联关系的两个模型,常用查询方法如下:

    1.png
    1对多的关系进行查询时,如图,使用BookInfo的对象b,通过b.heroinfo_set.all() 来进行查询;
    ‘多对1’的关系进行查询时,使用HeroInfo的对象h,通过关联属性hbook,经h.hbook操作来查询。

    操作示例

    (1) 查询出 id为2 的图书中所关联的英雄人物的信息。

    # 常规查询
    b = Booktest.objects.get(id=2)
    b.heroinfo_set.all()
    
    # 通过模型类查询(需要查询英雄信息,所以从HeroInfo类开始入手,即“多查1”)
    HeroInfo.objects.filter(hbook__id=2)
    

    输出:

    >> b = BookInfo.objects.get(id=2)
    >> b.heroinfo_set.all()
    <QuerySet [<HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>]>
    
    >> HeroInfo.objects.filter(book__id=2)
    <QuerySet [<HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>]>
    

    (2)查询图书关联的英雄描述中包含“八”的图书信息。

    # 通过模型类查询(要查的是图书,从BookInfo入手,即“1查多”)
    BookInfo.objects.filter(heroinfo__comment__contains='八')
    

    输出:

    >> BookInfo.objects.filter(heroinfo__comment__contains='八')
    <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>]>   # 数据库里郭靖和乔峰的描述都是“降龙十八掌”,所以查询结果包含这两本书
    

    (3)查询图书所关联的英雄id大于3的图书信息。

    # 通过模型类查询(要查的还是图书,从BookInfo入手,即“1查多”)
    BookInfo.objects.filter(heroinfo__id__gt=3)
    

    输出:

    >> BookInfo.objects.filter(heroinfo__id__gt=3)
    <QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 天龙八部>, <BookInfo: 天龙八部>]>
    

    相关文章

      网友评论

          本文标题:Django模型关联操作

          本文链接:https://www.haomeiwen.com/subject/kdgvgftx.html