zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ssh环境的搭建,基于注解和配置文件使用
    myeclipse db browser 新建数据源
    区别jquery对象和dom对象及转换方法
    C++中map容器的说明和使用技巧
    csh shell 语法 例子
    如何选择显示器
    Vim简明教程【CoolShell】
    perl
    perlretut
    ssh 配置详解
  • 原文地址:https://www.cnblogs.com/cpl9412290130/p/9955854.html
Copyright © 2011-2022 走看看