• ORM 外键查询


    ORM 外键查询

    Django 的 ORM 有多种关系:一对一,多对一,多对多。

    各自定义的方式为 :
           一对一: OneToOneField
           多对一: ForeignKey
           多对多: ManyToManyField
    from django.db import models
    
    class Engine(models.Model):
        name = models.CharField(max_length=25)
    
        def __str__(self):         #2.x版本  __unicode__(self)
            return self.name
    
    class Car(models.Model):
        name = models.CharField(max_length=25)
        engine = models.OneToOneField(Engine)
    
        def __str__(self):
            return self.name
    
    class Engine2(models.Model):
        name = models.CharField(max_length=25)
    
        def __str__(self):
            return self.name
    
    class Car2(models.Model):
        name = models.CharField(max_length=25)
        engine = models.ForeignKey(Engine2, unique=True)
    
        def __str__(self):
            return self.name

    OneToOneField Example

    from testapp.models import Car, Engine
    c = Car.objects.get(name='Audi')
    e = Engine.objects.get(name='Diesel')
    e.car  
    # engine 的model 定义中并没有car,这个是自动生成的,用关联表的类名小写直接访问
    <Car: Audi>  
    # 注意返回内容的不同

    ForeignKey with unique=True Example

    from testapp.models import Car2, Engine2
    c2 = Car2.objects.get(name='Mazda')
    e2 = Engine2.objects.get(name='Wankel')
    # 在未定义的model中用关联表类名小写加"_set"来访问,多对多也一样
    e2.car2_set.all()   
    # 注意返回内容的不同,这里是一个QuerySet
    [<Car2: Mazda>]   

    CODE VIEW

    from django.db import models
    
    # Create your models here.
    
    class IDC(models.Model):
        """机房"""
        name = models.CharField(max_length=64, unique=True)
    
        class Meta:
            verbose_name = '机房'
            verbose_name_plural = "机房"
    
        def __str__(self):
            return self.name
    
    
    class Host(models.Model):
        hostname = models.CharField(u'主机名', max_length=64, default="localhost", blank=True, null=True)
        intranet_ipaddr = models.GenericIPAddressField(u'内网地址', unique=True)
        network_ipaddr = models.GenericIPAddressField(u'公网地址', null=True, default=None, blank=True)
        memo = models.TextField(u'备注', blank=True, null=True, default=None)
        status_type = (
            (0, '离线'),
            (1, '在线'),
            (2, '维护中')
        )
        status = models.SmallIntegerField(u'状态', choices=status_type, default=1)
        user = models.ManyToManyField('User', blank=True)
        idc = models.ForeignKey('IDC', blank=True, null=True)
        system_type_choices = ((0, 'Linux'), (1, 'Windows'))
        system_type = models.SmallIntegerField(choices=system_type_choices, default=0)
        enabled = models.BooleanField(default=1, verbose_name="启用本机")
    
        class Meta:
            verbose_name = '主机'
            verbose_name_plural = "主机"
    
        def __str__(self):
            return self.hostname
    
    
    class BusinessUnit(models.Model):
        name = models.CharField(u'业务线', max_length=64, unique=True)
        parent_unit = models.ForeignKey('self', null=True, blank=True)
        memo = models.CharField(u'备注', max_length=128, blank=True)
    
        class Meta:
            verbose_name = '业务线'
            verbose_name_plural = "业务线"
    
        def __str__(self):
            return self.name
    
    
    class User(models.Model):
        username = models.CharField(u'用户名', max_length=64, null=True, blank=True)
        passwd = models.CharField(u'密码', max_length=128, null=True, blank=True)
    
        class Meta:
            verbose_name = '用户表'
            verbose_name_plural = "用户表"
            unique_together = ("username", 'passwd')
    
        def __str__(self):
            return self.username

    IDC表

    from userauth import models
    i = models.IDC.objects.get(name="苏州桥机房")
    
    # 反查询,使用小写的表名加_set字段
    i.host_set.all()
    
    # 查询结果为QuerySet类型
    <QuerySet [<Host: localhost>, <Host: 56.2>]>

    Host表

    from userauth import models
    h = models.Host.objects.get(id=1)
    
    h.hostname
    ----------'localhost'
    
     h.intranet_ipaddr
    ----------'10.10.56.1'
    
     h.user.all()     # 查询多对多字段
    ---------<QuerySet [<User: root>, <User: tomcat>]>
    
     h.idc    # 查询一对多字段
    ----------<IDC: 苏州桥机房>

    User表

    from userauth import models
    u = models.User.objects.get(username='root')
    
    u.username
    ---------'root'
    
     u.passwd
    ---------'12345678'
    
     u.host_set.all()     # 反查询多对多字段
    --------<QuerySet [<Host: localhost>]>

    BusinessUnit表

    from userauth import models
    b = models.BusinessUnit.objects.all()
    
    b.name
    --------'北京'
    
     b.parent_unit    # 自关联的一对多
    -------------<BusinessUnit: 二手车平台>

    欢迎吐槽!!!!!!!!!!

  • 相关阅读:
    学习笔记9
    学习笔记8
    学习笔记7
    学习笔记6
    学习笔记5
    学习笔记4
    学习笔记3
    学习笔记2
    学习笔记1
    矩形覆盖
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/6140367.html
Copyright © 2020-2023  润新知