zoukankan      html  css  js  c++  java
  • django 模型关系

    模型关系

    关系数据库的威力体现在表之间的相互关联,Django提供了三种最常见的数据库关系:多对一
    (many-to-one),多对多(many-to-many),一对一(one-to-one)

    • 多对一关系
    • 多对多关系
    • 一对一关系

    多对一

    • django是使用django.db.models.ForeignKey 定义多对一关系
    • ForeignKey需要一个位置参数来指定本Model关联的Model,ForeignKey关联的Model
      是"一", ForeignKey所在的Model是"多"

    比如汽车和制造商的例子,一辆汽车只能属于一个制造商,但是一个制造商有多辆汽车,这个关系,用Django的Model来表示,就是

    #一
    class Manufacturer(models.Model):
        name = models.CharField(max_length=30)
    #多
    class Car(models.Model):
        manufacturer = models.ForeignKey(Manufacturer)
        name = models.CharField(max_length=30)
    

    多对一查询

    • 正向查询( ForeignKey 所在的模型查询关联的模型)
    car = Car.objects.get(pk=2)
    car.manufacturer #返回一条Manufacturer 对象
    
    • 反向查询( ForeignKey 指向的模型查询ForeignKey 所在的模型)
    • 如果模型有一个ForeignKey,那么该ForeignKey 所指的模型实例可以通过一个管理器返回前一个有ForeignKey的模型的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。该管理器返回的查询集可以用上一节提到的方式进行过滤和操作。
    manufacturer = Manufacturer.objects.get(pk=1)
    manufacturer.car_set.all() # 返回多个car对象
    

    处理关联对象的其它方法

    • add(obj1, obj2, ...) #添加一指定的模型对象到关联的对象集中。
    • create(**kwargs) #创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对
      象。
    • remove(obj1, obj2, ...) #从关联的对象集中删除指定的模型对象。
    • clear() #从关联的对象集中删除所有的对象

    多对多

    • 要实现多对多,就要使用django.db.models.ManyToManyField类,和ForeignKey一样,它也有一个位置参数,用来指定和它关联的Model。
    • 如果不仅仅需要知道两个Model之间是多对多的关系,还需要知道这个关系的更多信息,比如Person和Group是多对多的关系,每个person可以在多个group里,那么group里可以有多个person

    多对多示例

    class Group(models.Model):
        name = CharField(max_length=50)
        #...
    class Person(models.Model):
        name = CharField(max_length=50)
        groups = models.ManyToManyField(Group)
    
    • 建议以被关联模型名称的复数形式做为 ManyToManyField 的名字
    • 在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可——不要在两个模型中都设置

    一对一

    • 一对一是通过django.db.models.OneToOneField来实现的,被关联的Model会被加上
      Unique的限制,OneToOneField要一个位置参数,与模型关- 联的类
    • 当某个对象想扩展自另一个对象时,最常用的方式就是在这个对象的主键上添加一对一关系
  • 相关阅读:
    linux-who
    Linux开机禁用开启防火墙
    linux环境vnc安装
    NFS配置及开机自动挂载
    yum list失败
    镜像文件挂载及本地yum搭建
    weblogic在64位windows的设置
    linux操作系统语言更改
    Linux磁盘空间扩容(LVM)
    Nginx 拒接服务漏洞(CVE-2016-0747)整改
  • 原文地址:https://www.cnblogs.com/guigujun/p/9177499.html
Copyright © 2011-2022 走看看