Django_外键查询和反查询

一、ForeignKey

@property装饰器的作用是返回一个属性特性,在数据库中也有一些小技巧可以拿来用,比如今天要写的外键查询和反向查询的内容。

复制代码
 1 from django.db import models
 2 
 3 class Person(models.Model):
 4     name = models.CharField(max_length=20, verbose_name='姓名')
 5     age = models.IntegerField(default=0, verbose_name='年龄')
 6     tel = models.CharField(max_length=11, verbose_name='电话')
 7 
 8     class Meta:
 9         verbose_name = ''
10         verbose_name_plural = verbose_name
11 
12     @property
13     def all_cars(self):
14         return self.all()
15     
16     @property
17     def info(self):
18         # return the name and tel of person
19         return '%s %s' % (self.name, self.tel)
20 
21 class Car(models.Model):
22     owner = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='cars', verbose_name='车主')
23     brand = models.CharField(max_length=64, verbose_name='品牌')
24     price = models.FloatField(default=0, verbose_name='价格')
25 
26     class Meta:
27         verbose_name = '汽车'
28         verbose_name_plural = verbose_name
复制代码

在上面我们创建了两个表,Person为主表,Car为子表,Car中有外键(ForeignKey)键至Person。

  • 子表查询主表的方式:
1 car = Car.objects.get(id=1)
2 # 查询该车的车主
3 owner = car.owner
  • 主表查询子表的方式:
复制代码
1 Bruce = Person.objects.get(id=1)
2 """查询此人有多少车"""
3 # 方式一:Django默认每个主表都有一个外键属性
4 # 通过该方式来查询属性,方式:主表.从表_set
5 Bruce.car_set.all()
6 # 方式二:通过在外键中设置related_name属性值访问,本例设置related_name='cars'
7 Bruce.self.all()
8 # 方式三:通过@property装饰器在主表model预定义方法实现:
9 Bruce.all_cars
复制代码

查询一些自己需要的组合数据的时候,比如获取Person的一些个人信息,在@property的预定义info方法下,Bruce.info即可实现。

 

1 # 利用@property装饰器在Person中预定义info方法实现获取个人信息
2 Bruce_info = Bruce.info

 

posted @   丹华抱一鷇音子  阅读(9086)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示