一、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