标签:管理器 gif log 模型 password 定义 datetime def 返回
查询操作是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)
正向访问就是通过含有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() # 修改后要保存
反向访问就是通过外键的关联表查询含有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()
多对多关系的两端都会自动获得访问另一端的API。这些API的工作方式与前面提到的“反向”一对多关系的用法一样。
唯一的区别在于属性的名称:定义ManyToManyField的模型使用该字段的属性名称,而“反向”模型使用源模型的小写名称加上‘_set‘ (和一对多关系一样)。
标签:管理器 gif log 模型 password 定义 datetime def 返回
原文地址:https://www.cnblogs.com/lymlike/p/11467042.html