django中related_name的用法说明

我们从一个简单的事说起:

吃货君到水果摊捡漏买了两种水果,分别是人参果和蟠桃;后来水果摊主冥冥中感觉自己遗失了重宝,似乎和一个100岁的老爷爷有关,翻看自己的收款账单,当看到吃货君的账单时心头一紧,就是他买走了我的宝贝,我就要看看他买了我的什么宝贝! 店主通过吃货君的名字找到了他买的水果,发现竟然有万年蟠桃以及亿年人参过后,嚎啕大哭起来!!!

吃饭君是走了什么运呢???

下面我们根据上面的小情节定义两个模型,分别是买主模型以及水果模型,一个买主对应多个水果模型,简单的一对多模型:

class Buyer(models.Model):
  name = models.CharField(verbose_name='买主名', max_length=10)
  Alipay_id = models.CharField(verbose_name='支付宝账号')
  age = models.IntegerField(verbose_name='买主年龄',blank = True)

class Fruit(models.Model):
  buyer = models.ForeignKey(Buyer, related_name='buyer_fruit')
  fruit_name = models.CharField(verbose_name='水果名', max_length=10)
  weight = models.FloatField(verbose_name='水果重量') 

通常,我们要查询买主买了哪些水果,首先要根据条件找到买主信息,然后根据买主信息找到买主所购买的水果,本例中如下:

#首先获得水果模型中外键指向的表中对象:
buyer = Buyer.objects.filter(age = 100).first()

#然后通过‘_set'方法获得子表中的数据:
fruits = buyer.fruit_set.all()
"""
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。 这个属性的名称默认是以子表的名称小写加上_set()来表示,这里我们的主表是buyer,字表是fruit,所以主表外键的属性就是fruit_set
"""

上面的fruit_set是django为对象buyer默认创建的外键的属性,个人建议采用自定义的方式定义主表的外键,这样使用时更熟悉一些吧!

而related_name就实现这个功能,在字表中定义外键时,增加related_name字段指定这个字表在主表中对应的外键属性,

如下:

class Fruit(models.Model):
  buyer = models.ForeignKey(Buyer, related_name='buyer_fruit')
"""
主表:buyer
子表:fruit
子表在主表中对应的外键属性:related_name='buyer_fruit'
"""

那么我们就可以通过自定义外键的方式找到需要的信息了:

#首先获得水果模型中外键指向的表中对象:
buyer = Buyer.objects.filter(age = 100).first()

#然后通过子表中自定义的外键获取子表的所有信息:
fruits = buyer.buyer_fruit.all() 

以上这篇django中related_name的用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Django 解决model 反向引用中的related_name问题

    问题: 定义表Apple: class Apple( models.Model): origin_level = models.ForeignKey(AppleLevel) new_level = models.ForeignKey(AppleLevel) 出现如下问题: monitor.apple: Accessor for field 'origin_level' clashes with related field 'AppleLevel.apple_set'. Add a related

  • Django表单提交后实现获取相同name的不同value值

    i前端:nput_test.html <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>Search</title> <script> </script> </head> <body> <div><p>{{ result }}</

  • django rest framework serializers序列化实例

    serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用: - 将queryset与model实例等进行序列化,转化成json格式,返回给用户(api接口). - 将post与patch/put的上来的数据进行验证. - 对post与patch/put数据进行处理. 实现序列化二个类:Serializer与ModelSerializer 比较 ModelSerializer(Serializer) 即 ModelSerializer继承了Se

  • Django之全局使用request.user.username的实例详解

    我就废话不多说了,大家还是直接看代码吧! def pro_mgr(): """ 获取当前登陆用户的项目 :return: """ if DEVELOP_USER_NAME == 'admin': return Project.objects.all() return Project.objects.filter(prj_mgr=DEVELOP_USER_NAME) class DeployApplyForm(ModelForm): # proje

  • django中related_name的用法说明

    我们从一个简单的事说起: 吃货君到水果摊捡漏买了两种水果,分别是人参果和蟠桃:后来水果摊主冥冥中感觉自己遗失了重宝,似乎和一个100岁的老爷爷有关,翻看自己的收款账单,当看到吃货君的账单时心头一紧,就是他买走了我的宝贝,我就要看看他买了我的什么宝贝! 店主通过吃货君的名字找到了他买的水果,发现竟然有万年蟠桃以及亿年人参过后,嚎啕大哭起来!!! 吃饭君是走了什么运呢??? 下面我们根据上面的小情节定义两个模型,分别是买主模型以及水果模型,一个买主对应多个水果模型,简单的一对多模型: class B

  • Django中的session用法详解

    一.Session 的概念 cookie 是在浏览器端保存键值对数据,而 session 是在服务器端保存键值对数据 session 的使用依赖 cookie:在使用 Session 后,会在 Cookie 中存储一个 sessionid 的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到 sessionid 后,会根据这个值找出这个请求者的 Session. 二.Django 中 Session 的存储 session 键值对数据保存 session 的键值对数据默认保存在 dj

  • Django中的FBV和CBV用法详解

    FBV FBV,即 func base views,函数视图,在视图里使用函数处理请求. 以用户注册代码为例, 使用两个函数完成注册 初级注册代码 def register(request): """返回注册页面""" return render(request, "register.html") def register_handle(request): """进行注册处理""

  • django orm模块中的 is_delete用法

    数据库删除数据咱都知道,简单的说就是当一条数据对企业没用后,一般人可能会选择删除这条数据. 但是删除后,万一以后又突然有用呢.所以我们这时候会选择在写orm模块的时候,加入is_delete字段 is_delete = models.BooleanField(default=False,verbose_name='是否删除') 这样以后咱如果要删除一条数据了,就设置一下 is_delete=1 就表示这条数据在逻辑上删除了,简单的说就是你再怎么搜数据库也搜不到了,如果以后还用,就再设置 is_d

  • Django中FilePathField字段的用法

    class FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) 一个 CharField ,内容只限于文件系统内特定目录下的文件名.有三个参数, 其中第一个是 必需的: FilePathField.path 必填.这个FilePathField 应该得到其选择的目录的绝对文件系统路径.例如: "/home/images". FilePathField.match 可选的.F

  • Django中Q查询及Q()对象 F查询及F()对象用法

    Django Q/F #1 环境 Python3.7.3 Django==2.0.6 #2 开始 #2.1 django F()表达式 每次获取times当前的值,再+1,这样需要将times值取出,存到内存中 obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save() 虽然 obj.times = F("times") + 1 看起来像常规的Python为实例属性赋值

  • 对Django中内置的User模型实例详解

    User模型 User模型是这个框架的核心部分.他的完整的路径是在django.contrib.auth.models.User. 字段 内置的User模型拥有以下的字段: 1.username: 用户名.150个字符以内.可以包含数字和英文字符,以及_.@.+..和-字符.不能为空,且必须唯一! 2.first_name:歪果仁的first_name,在30个字符以内.可以为空. 3.last_name:歪果仁的last_name,在150个字符以内.可以为空. 4.email:邮箱.可以为空

  • Django框架中间件(Middleware)用法实例分析

    本文实例讲述了Django框架中间件(Middleware)用法.分享给大家供大家参考,具体如下: 1.面向切面编程 切点(钩子) 切点允许我们动态的在原有逻辑中插入一部分代码 在不修改原有代码的情况下,动态注入一部分代码 默认情况,不中断传播,切点会自动愈合(自动执行原有逻辑) 如果我们执行了中断操作(return,raise),没接上,会直接到程序结尾 五个切面:1.请求交给路由处理之前:2.请求交给视图处理之前:3.请求交给视图渲染后:4.渲染结果返回给模板之前:5.出现异常. 2.Dja

  • Django中使用 Closure Table 储存无限分级数据

    Django中使用 Closure Table 储存无限分级数据 起步 上一篇讨论了如何用数据库存储无限分级的数据.对于数据量大的情况(比如用户之间有邀请链,有点三级分销的意思),就要用到 closure table 的结构来进行存储.那么在 Django 中如何处理这个结构的模型呢? 定义模型 至少是要两个模型的,一个是存储分类,一个储存分类之间的关系: class Category(models.Model): name = models.CharField(max_length=31) d

  • Django中的用户身份验证示例详解

    前言 这次开发微信抢票程序中,普通用户的身份是由微信管理的.当用户通过微信公众号(测试号)向后台发消息时,微信会将用户的身份标记为一个unique_id来识别,后端可以由此来判断用户身份.这种认证比较特殊,它不存在登陆.登出的操作.如果是一个普通的web应用,应该有用户的登陆.登出操作,当用户未经授权访问某个URL的时候,后端应该拒绝这次请求,或者是重定向到登陆界面. 在这次作业中,因为需要一个后台管理员来管理各种活动的创建和发布,因此也需要有用户的身份认证操作.这次的后端是Django,试了一

随机推荐