Django——模型基础

Posted lymlike

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django——模型基础相关的知识,希望对你有一定的参考价值。

查询操作是Django的ORM框架中最重要的内容之一。建立模型、保存数据为的就是在需要的时候可以查询得到数据

本文的内容基于如下的一个博客应用模型:

技术图片
class User(models.Model):
    """用户表"""
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    blog = models.OneToOne(to=Blog,on_delete=models.CASCADE)


class Blog(models.Model):
    """博客表"""
    title = models.CharField(max_length=32)

    
class Tag(models.Model):
    """标签表"""
    title = models.CharField(max_length=32, default=‘‘)
    blog = models.ForeignKey(to=Blog,on_delete=models.CASCADE)


class Blog(models.Model):
    """博文表"""
    user = models.ForeignKey( to=User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField( default=‘‘)
    create_time = models.DateTimeField( default=timezone.now) 
    tag = models.ManyToManyField(Tag)
View Code

 

1.一对多(ForeignKey)

1.正向查询

正向访问就是通过含有ForeignKey字段的表查询其关联表,本例中为通过Blog的user列查询表BlogUser。

查询方法:直接通过圆点加属性,访问外键对象:

obj = models.Blog.objects.get(id=1)
b = obj.user   # b即为关联的Blog对象

要注意的是,对外键的修改,必须调用save方法进行保存:

obj = models.Blog.objects.get(id=1)
obj.user = another_user
obj.save()    # 修改后要保存

 

2.反向查询

反向访问就是通过外键的关联表查询含有ForeignKey字段的表,本例中为通过表BlogUser查询表Blog。

查询方法:通过一个管理器进行反向查询,返回源模型的所有实例。默认情况下,这个管理器的名字为FOO_set,其中FOO是要查找模型的小写名称(本例为Blog的小写)。该管理器返回的查询集还可以进行过滤和操作:

obj2 = models.BlogUser.objects.get(id=2)
u = obj2.blog_set.all()   # 返回所有Blog对象(与BlogUser表中id=2关联的对象)

还可以在ForeignKey字段的定义中,通过设置related_name来重写FOO_set的名字,例如:把Blog表的user字段修改为:user = models.ForeignKey(verbose_name=‘作者‘, to=‘BlogUser‘, on_delete=‘models.CASCADE‘, related_name=‘blogs‘),那么上面的查询将变成:

obj2 = models.BlogUser.objects.get(id=2)
u = obj2.blogs.all()

 

2.多对多(ManyToMany)

多对多关系的两端都会自动获得访问另一端的API。这些API的工作方式与前面提到的“反向”一对多关系的用法一样。

唯一的区别在于属性的名称:定义ManyToManyField的模型使用该字段的属性名称,而“反向”模型使用源模型的小写名称加上‘_set‘ (和一对多关系一样)。

 

以上是关于Django——模型基础的主要内容,如果未能解决你的问题,请参考以下文章

Django基础之MTV模型

python django基础

06模型基础

Django基础篇

如何在 Django Summernote 中显示编程片段的代码块?

Django基础