zoukankan      html  css  js  c++  java
  • django中model模型

    python manage.py dumpdata blog       # 导出blog数据

    python manage.py loaddata blog_dump.json   # 导入数据

     model模型

      关系对象映射(Object Relational Mapping,简称ORM),根据代码中定义的类来自动生成数据库表。

    1 from django.db import models
    2 
    3 class UserInfo(models.Model):
    4     name = models.CharField(max_length=30)
    5     sex = models.BooleanField()
    6     email = models.EmailField()
    7     memo = models.TextField()
    model实例
    models.AutoField  自增列 = int(11)
      如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
    models.CharField  字符串字段
      必须 max_length 参数
    models.BooleanField  布尔类型=tinyint(1)
      不能为空,Blank=True
    models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
      继承CharField,所以必须 max_lenght 参数
    models.DateField  日期类型 date
      对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
    models.DateTimeField  日期类型 datetime
      同DateField的参数
    models.Decimal  十进制小数类型 = decimal
      必须指定整数位max_digits和小数位decimal_places
    models.EmailField  字符串类型(正则表达式邮箱) =varchar
      对字符串进行正则表达式
    models.FloatField  浮点类型 = double
    models.IntegerField  整形
    models.BigIntegerField  长整形
      integer_field_ranges = {
        'SmallIntegerField': (-32768, 32767),
        'IntegerField': (-2147483648, 2147483647),
        'BigIntegerField': (-9223372036854775808, 9223372036854775807),
        'PositiveSmallIntegerField': (0, 32767),
        'PositiveIntegerField': (0, 2147483647),
      }
    models.IPAddressField  字符串类型(ip4正则表达式)
    models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
      参数protocol可以是:both、ipv4、ipv6
      验证时,会根据设置报错
    models.NullBooleanField  允许为空的布尔类型
    models.PositiveIntegerFiel  正Integer
    models.PositiveSmallIntegerField  正smallInteger
    models.SlugField  减号、下划线、字母、数字
    models.SmallIntegerField  数字
      数据库中的字段有:tinyint、smallint、int、bigint
    models.TextField  字符串=longtext
    models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
    models.URLField  字符串,地址正则表达式
    models.BinaryField  二进制
    models.ImageField   图片
    models.FilePathField 文件
    
    字段参数:
    
    null=True
      数据库中字段是否可以为空
    blank=True
      django的 Admin 中添加数据时是否可允许空值
    primary_key = False
      主键,对AutoField设置主键后,就会代替原来的自增 id 列
    auto_now 和 auto_now_add
      auto_now   自动创建---无论添加或修改,都是当前操作的时间
      auto_now_add  自动创建---永远是创建时的时间
    choices
    	GENDER_CHOICE = (
    			(u'M', u'Male'),
    			(u'F', u'Female'),
    		)
    	gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
    max_length
    default  默认值
    verbose_name  Admin中字段的显示名称
    name|db_column  数据库中的字段名称
    unique=True  不允许重复
    db_index = True  数据库索引
    editable=True  在Admin里是否可编辑
    error_messages=None  错误提示
    auto_created=False  自动创建
    help_text  在Admin中提示帮助信息
    validators=[]
    upload-to
     1 null                数据库中字段是否可以为空
     2     db_column           数据库中字段的列名
     3     db_tablespace
     4     default             数据库中字段的默认值
     5     primary_key         数据库中字段是否为主键
     6     db_index            数据库中字段是否可以建立索引
     7     unique              数据库中字段是否可以建立唯一索引
     8     unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
     9     unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
    10     unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    11 
    12     verbose_name        Admin中显示的字段名称
    13     blank               Admin中是否允许用户输入为空
    14     editable            Admin中是否可以编辑
    15     help_text           Admin中该字段的提示信息
    16     choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
    17                         如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    18 
    19     error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
    20                         字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
    21                         如:{'null': "不能为空.", 'invalid': '格式错误'}
    22 
    23     validators          自定义错误验证(列表类型),从而定制想要的验证规则
    24                         from django.core.validators import RegexValidator
    25                         from django.core.validators import EmailValidator,URLValidator,DecimalValidator,
    26                         MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
    27                         如:
    28                             test = models.CharField(
    29                                 max_length=32,
    30                                 error_messages={
    31                                     'c1': '优先错信息1',
    32                                     'c2': '优先错信息2',
    33                                     'c3': '优先错信息3',
    34                                 },
    35                                 validators=[
    36                                     RegexValidator(regex='root_d+', message='错误了', code='c1'),
    37                                     RegexValidator(regex='root_112233d+', message='又错误了', code='c2'),
    38                                     EmailValidator(message='又错误了', code='c3'), ]
    39                             )
    参数
     1 class UserInfo(models.Model):
     2         nid = models.AutoField(primary_key=True)
     3         username = models.CharField(max_length=32)
     4         class Meta:
     5             # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
     6             db_table = "table_name"
     7 
     8             # 联合索引
     9             index_together = [
    10                 ("pub_date", "deadline"),
    11             ]
    12 
    13             # 联合唯一索引
    14             unique_together = (("driver", "restaurant"),)
    15 
    16             # admin中显示的表名称
    17             verbose_name
    18 
    19             # verbose_name加s
    20             verbose_name_plural
    21         
    22     更多:https://docs.djangoproject.com/en/1.10/ref/models/options/
    元信息
     1 1.触发Model中的验证和错误提示有两种方式:
     2         a. Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示,如果都成功,才来检查Model的字段并显示指定错误信息
     3         b. 调用Model对象的 clean_fields 方法,如:
     4             # models.py
     5             class UserInfo(models.Model):
     6                 nid = models.AutoField(primary_key=True)
     7                 username = models.CharField(max_length=32)
     8 
     9                 email = models.EmailField(error_messages={'invalid': '格式错了.'})
    10 
    11             # views.py
    12             def index(request):
    13                 obj = models.UserInfo(username='11234', email='uu')
    14                 try:
    15                     print(obj.clean_fields())
    16                 except Exception as e:
    17                     print(e)
    18                 return HttpResponse('ok')
    19 
    20            # Model的clean方法是一个钩子,可用于定制操作,如:上述的异常处理。
    21 
    22     2.Admin中修改错误提示
    23         # admin.py
    24         from django.contrib import admin
    25         from model_club import models
    26         from django import forms
    27 
    28 
    29         class UserInfoForm(forms.ModelForm):
    30             username = forms.CharField(error_messages={'required': '用户名不能为空.'})
    31             email = forms.EmailField(error_messages={'invalid': '邮箱格式错误.'})
    32             age = forms.IntegerField(initial=1, error_messages={'required': '请输入数值.', 'invalid': '年龄必须为数值.'})
    33 
    34             class Meta:
    35                 model = models.UserInfo
    36                 # fields = ('username',)
    37                 fields = "__all__"
    38 
    39 
    40         class UserInfoAdmin(admin.ModelAdmin):
    41             form = UserInfoForm
    42 
    43 
    44         admin.site.register(models.UserInfo, UserInfoAdmin)
    扩展知识

    数据库中表与表之间的关系

    一对多,  models.ForeignKey(ColorDic)
    一对一,    models.OneToOneField(OneModel)
    多对多,    authors = models.ManyToManyField(Author)
    
    增加:创建实例,并调用save
    更新:a.获取实例,再sava;b.update(指定列)
    删除:a. filter().delete(); b.all().delete()
    获取:a. 单个=get(id=1) ;b. 所有 = all()
    过滤:filter(name='xxx');filter(name__contains='');(id__in = [1,2,3]) ;
    icontains(大小写无关的LIKE),startswith和endswith, 还有range(SQLBETWEEN查询)'gt', 'in', 'isnull', 'endswith', 'contains', 'lt', 'startswith', 'iendswith', 'icontains','range', 'istartswith'
    排序:order_by("name") =asc ;order_by("-name")=desc
    返回第n-m条:第n条[0];前两条[0:2]
    指定映射:values
    数量:count()
    聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))  

    model操作

      1 ForeignKey(ForeignObject) # ForeignObject(RelatedField)
      2         to,                         # 要进行关联的表名
      3         to_field=None,              # 要关联的表中的字段名称
      4         on_delete=None,             # 当删除关联表中的数据时,当前表与其关联的行的行为
      5                                         - models.CASCADE,删除关联数据,与之关联也删除
      6                                         - models.DO_NOTHING,删除关联数据,引发错误IntegrityError
      7                                         - models.PROTECT,删除关联数据,引发错误ProtectedError
      8                                         - models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
      9                                         - models.SET_DEFAULT,删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
     10                                         - models.SET,删除关联数据,
     11                                                       a. 与之关联的值设置为指定值,设置:models.SET(值)
     12                                                       b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
     13 
     14                                                         def func():
     15                                                             return 10
     16 
     17                                                         class MyModel(models.Model):
     18                                                             user = models.ForeignKey(
     19                                                                 to="User",
     20                                                                 to_field="id"
     21                                                                 on_delete=models.SET(func),)
     22         related_name=None,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
     23         related_query_name=None,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
     24         limit_choices_to=None,      # 在Admin或ModelForm中显示关联数据时,提供的条件:
     25                                     # 如:
     26                                             - limit_choices_to={'nid__gt': 5}
     27                                             - limit_choices_to=lambda : {'nid__gt': 5}
     28 
     29                                             from django.db.models import Q
     30                                             - limit_choices_to=Q(nid__gt=10)
     31                                             - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
     32                                             - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
     33         db_constraint=True          # 是否在数据库中创建外键约束
     34         parent_link=False           # 在Admin中是否显示关联数据
     35 
     36 
     37     OneToOneField(ForeignKey)
     38         to,                         # 要进行关联的表名
     39         to_field=None               # 要关联的表中的字段名称
     40         on_delete=None,             # 当删除关联表中的数据时,当前表与其关联的行的行为
     41 
     42                                     ###### 对于一对一 ######
     43                                     # 1. 一对一其实就是 一对多 + 唯一索引
     44                                     # 2.当两个类之间有继承关系时,默认会创建一个一对一字段
     45                                     # 如下会在A表中额外增加一个c_ptr_id列且唯一:
     46                                             class C(models.Model):
     47                                                 nid = models.AutoField(primary_key=True)
     48                                                 part = models.CharField(max_length=12)
     49 
     50                                             class A(C):
     51                                                 id = models.AutoField(primary_key=True)
     52                                                 code = models.CharField(max_length=1)
     53 
     54     ManyToManyField(RelatedField)
     55         to,                         # 要进行关联的表名
     56         related_name=None,          # 反向操作时,使用的字段名,用于代替 【表名_set】 如: obj.表名_set.all()
     57         related_query_name=None,    # 反向操作时,使用的连接前缀,用于替换【表名】     如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名')
     58         limit_choices_to=None,      # 在Admin或ModelForm中显示关联数据时,提供的条件:
     59                                     # 如:
     60                                             - limit_choices_to={'nid__gt': 5}
     61                                             - limit_choices_to=lambda : {'nid__gt': 5}
     62 
     63                                             from django.db.models import Q
     64                                             - limit_choices_to=Q(nid__gt=10)
     65                                             - limit_choices_to=Q(nid=8) | Q(nid__gt=10)
     66                                             - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
     67         symmetrical=None,           # 仅用于多对多自关联时,symmetrical用于指定内部是否创建反向操作的字段
     68                                     # 做如下操作时,不同的symmetrical会有不同的可选字段
     69                                         models.BB.objects.filter(...)
     70 
     71                                         # 可选字段有:code, id, m1
     72                                             class BB(models.Model):
     73 
     74                                             code = models.CharField(max_length=12)
     75                                             m1 = models.ManyToManyField('self',symmetrical=True)
     76 
     77                                         # 可选字段有: bb, code, id, m1
     78                                             class BB(models.Model):
     79 
     80                                             code = models.CharField(max_length=12)
     81                                             m1 = models.ManyToManyField('self',symmetrical=False)
     82 
     83         through=None,               # 自定义第三张表时,使用字段用于指定关系表
     84         through_fields=None,        # 自定义第三张表时,使用字段用于指定关系表中那些字段做多对多关系表
     85                                         from django.db import models
     86 
     87                                         class Person(models.Model):
     88                                             name = models.CharField(max_length=50)
     89 
     90                                         class Group(models.Model):
     91                                             name = models.CharField(max_length=128)
     92                                             members = models.ManyToManyField(
     93                                                 Person,
     94                                                 through='Membership',
     95                                                 through_fields=('group', 'person'),
     96                                             )
     97 
     98                                         class Membership(models.Model):
     99                                             group = models.ForeignKey(Group, on_delete=models.CASCADE)
    100                                             person = models.ForeignKey(Person, on_delete=models.CASCADE)
    101                                             inviter = models.ForeignKey(
    102                                                 Person,
    103                                                 on_delete=models.CASCADE,
    104                                                 related_name="membership_invites",
    105                                             )
    106                                             invite_reason = models.CharField(max_length=64)
    107         db_constraint=True,         # 是否在数据库中创建外键约束
    108         db_table=None,              # 默认创建第三张表时,数据库中表的名称
    字段及参数
     1 #
     2     #
     3     # models.Tb1.objects.create(c1='xx', c2='oo')  增加一条数据,可以接受字典类型数据 **kwargs
     4 
     5     # obj = models.Tb1(c1='xx', c2='oo')
     6     # obj.save()
     7 
     8     #
     9     #
    10     # models.Tb1.objects.get(id=123)         # 获取单条数据,不存在则报错(不建议)
    11     # models.Tb1.objects.all()               # 获取全部
    12     # models.Tb1.objects.filter(name='seven') # 获取指定条件的数据
    13 
    14     #
    15     #
    16     # models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
    17 
    18     #
    19     # models.Tb1.objects.filter(name='seven').update(gender='0')  # 将指定条件的数据更新,均支持 **kwargs
    20     # obj = models.Tb1.objects.get(id=1)
    21     # obj.c1 = '111'
    22     # obj.save()                                                 # 修改单条数据
    基本操作
     1 # 获取个数
     2         #
     3         # models.Tb1.objects.filter(name='seven').count()
     4 
     5         # 大于,小于
     6         #
     7         # models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
     8         # models.Tb1.objects.filter(id__gte=1)              # 获取id大于等于1的值
     9         # models.Tb1.objects.filter(id__lt=10)             # 获取id小于10的值
    10         # models.Tb1.objects.filter(id__lte=10)             # 获取id小于10的值
    11         # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
    12 
    13         # in
    14         #
    15         # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    16         # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
    17 
    18         # isnull
    19         # Entry.objects.filter(pub_date__isnull=True)
    20 
    21         # contains
    22         #
    23         # models.Tb1.objects.filter(name__contains="ven")
    24         # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
    25         # models.Tb1.objects.exclude(name__icontains="ven")
    26 
    27         # range
    28         #
    29         # models.Tb1.objects.filter(id__range=[1, 2])   # 范围bettwen and
    30 
    31         # 其他类似
    32         #
    33         # startswith,istartswith, endswith, iendswith,
    34 
    35         # order by
    36         #
    37         # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
    38         # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc
    39 
    40         # group by
    41         #
    42         # from django.db.models import Count, Min, Max, Sum
    43         # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
    44         # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
    45 
    46         # limit 、offset
    47         #
    48         # models.Tb1.objects.all()[10:20]
    49 
    50         # regex正则匹配,iregex 不区分大小写
    51         #
    52         # Entry.objects.get(title__regex=r'^(An?|The) +')
    53         # Entry.objects.get(title__iregex=r'^(an?|the) +')
    54 
    55         # date
    56         #
    57         # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
    58         # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
    59 
    60         # year
    61         #
    62         # Entry.objects.filter(pub_date__year=2005)
    63         # Entry.objects.filter(pub_date__year__gte=2005)
    64 
    65         # month
    66         #
    67         # Entry.objects.filter(pub_date__month=12)
    68         # Entry.objects.filter(pub_date__month__gte=6)
    69 
    70         # day
    71         #
    72         # Entry.objects.filter(pub_date__day=3)
    73         # Entry.objects.filter(pub_date__day__gte=3)
    74 
    75         # week_day
    76         #
    77         # Entry.objects.filter(pub_date__week_day=2)
    78         # Entry.objects.filter(pub_date__week_day__gte=2)
    79 
    80         # hour
    81         #
    82         # Event.objects.filter(timestamp__hour=23)
    83         # Event.objects.filter(time__hour=5)
    84         # Event.objects.filter(timestamp__hour__gte=12)
    85 
    86         # minute
    87         #
    88         # Event.objects.filter(timestamp__minute=29)
    89         # Event.objects.filter(time__minute=46)
    90         # Event.objects.filter(timestamp__minute__gte=29)
    91 
    92         # second
    93         #
    94         # Event.objects.filter(timestamp__second=31)
    95         # Event.objects.filter(time__second=2)
    96         # Event.objects.filter(timestamp__second__gte=31)
    进阶操作
     1 # extra
     2     #
     3     # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
     4     #    Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
     5     #    Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
     6     #    Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
     7     #    Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
     8 
     9     # F
    10     #
    11     # from django.db.models import F
    12     # models.Tb1.objects.update(num=F('num')+1)
    13 
    14 
    15     # Q
    16     #
    17     # 方式一:
    18     # Q(nid__gt=10)
    19     # Q(nid=8) | Q(nid__gt=10)
    20     # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    21     # 方式二:
    22     # con = Q()
    23     # q1 = Q()
    24     # q1.connector = 'OR'
    25     # q1.children.append(('id', 1))
    26     # q1.children.append(('id', 10))
    27     # q1.children.append(('id', 9))
    28     # q2 = Q()
    29     # q2.connector = 'OR'
    30     # q2.children.append(('c1', 1))
    31     # q2.children.append(('c1', 10))
    32     # q2.children.append(('c1', 9))
    33     # con.add(q1, 'AND')
    34     # con.add(q2, 'AND')
    35     #
    36     # models.Tb1.objects.filter(con)
    37 
    38 
    39     # 执行原生SQL
    40     #
    41     # from django.db import connection, connections
    42     # cursor = connection.cursor()  # cursor = connections['default'].cursor()
    43     # cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    44     # row = cursor.fetchone()
    其他操作

    原始sql

    cursor = connection.cursor()
    cursor.execute('''SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", ['Lennon'])
    row = cursor.fetchone() 
    

     点与双下划线的作用

     1 from django.db import models
     2 
     3 
     4 class Project(models.Model):
     5     name = models.CharField(max_length=32, blank=True)
     6     id = models.CharField(max_length=32, unique=True, primary_key=True, blank=True)
     7     create_date = models.DateTimeField(auto_now_add=True)
     8     update_date = models.DateTimeField(auto_now=True)
     9 
    10     def __str__(self):
    11         return self.name
    12 
    13 
    14 class Uhost(models.Model):
    15     name = models.CharField(max_length=32, blank=True)
    16     id = models.CharField(max_length=32, blank=False, primary_key=True)
    17     ip = models.GenericIPAddressField(blank=True, null=True)
    18     project = models.ForeignKey(Project, verbose_name=u'所属项目', db_constraint=False, on_delete=models.DO_NOTHING, blank=True)
    19     create_date = models.DateTimeField(u'创建时间', auto_now_add=True)
    20     update_date = models.DateTimeField(u'更新时间', auto_now=True)
    21 
    22     def __str__(self):
    23         return self.name
    models.py

    object对象:对象获取某一列值(或者说是获取某个属性)的时候,使用点来获取。跨表查询时,也是使用点来获取。

    一个object对象就是表中的一条数据,表中所有的字段它都有。例如我取Uhost表中的第一个对象
    
    >>> host = Uhost.objects.all()[0]
    >>> print type(host)
    	<class 'ucloud.models.Uhost'>
    
    对象获取某个值使用“.”
    
    >>> host.id
    	u'uhost-3th2rp'
    >>> host.ip
    	u'10.6.13.253'
    >>> host.project
    	<Project: CPMS10>
    注意:Uhost表中project字段是一个ForeighKey,当获取host.project时,获取到的结果是一个对象
    
    我们还可以获取这个对象其他值,比如Project表中定义了name、id、create_time、update_time四个字段,我们可以通过下面的方式获取
    
    >>> host.project.name
            u'CPMS10'
    >>> host.project.id
            u'org-81'
    >>> host.project.create_date
            datetime.datetime(2017, 3, 6, 12, 21, 7, 296546)
    >>> host.project.update_date
            datetime.datetime(2017, 5, 19, 16, 19, 8, 925978)
    
    >>> host.project_id
    	u'org-81'
    >>> host.project_name
    Traceback (most recent call last):
      File "<console>", line 1, in <module>
    AttributeError: 'Uhost' object has no attribute 'project_name'
    这里我们之所以能获取到project_id这个字段的值是因为,在Uhost表中project字段是ForeignKey,而在数据库中被设置了外键的列,在数据库中的字段名就是本表中的列名 +“_“”+被设置外键的表的那个字段名,而Project表中id是primary_key,所以id列被设置了外键 。
    
    由上可知,host.project.id是跨表查询,而host.project_id并不是跨表查询。因为这个字段在自己表中。
    

    QuerySet查询集:查询集是一组数据的集合,跟python的list基本一样的。查询集做跨表查询时,使用双下划线"__"。

    >>> host2 = Uhost.objects.all().values('ip','name')
    >>> print type(host2)
    	<class 'django.db.models.query.ValuesQuerySet'>
    	[{'ip': u'10.6.13.253', 'name': u'dbbackupsyncer2'}, {'ip': u'10.6.30.43', 'name': u'SRV-CPMS10-WEB16'}, {'ip': u'10.6.20.189', 'name': u'SRV-CPMS10-WEB15'}, {'ip': u'10.6.14.232', 'name': u'publicconsole'}, {'ip': u'10.6.10.236', 'name': u'SRV-CPMS10-WEB14'}, {'ip': u'10.6.10.159', 'name': u'dbbackupsyncer'}, {'ip': u'10.6.11.73', 'name': u'u5b98u7f51'}, {'ip': u'10.6.7.170', 'name': u'99exchangedb'}, {'ip': u'10.6.5.22', 'name': u'dc1'}, {'ip': u'10.6.3.243', 'name': u'dc2'}, {'ip': u'10.6.2.213', 'name': u'publicweb'}, {'ip': u'10.6.8.163', 'name': u'SRV-CPMS10-WEB13'}, {'ip': u'10.10.16.165', 'name': u'SRV-OTA10-WS04'}, {'ip': u'10.10.31.79', 'name': u'SRV-OTA10-WS05'}, {'ip': u'10.10.187.86', 'name': u'SRV-OTA10-WS03'}, {'ip': u'10.10.102.32', 'name': u'SRV-OTA10-WEB04'}, {'ip': u'10.10.107.144', 'name': u'SRV-OTA10-WEB03'}, {'ip': u'10.10.112.46', 'name': u'99datasyncer'}, {'ip': u'10.10.48.121', 'name': u'SRV-CPMS10-WEB31'}, {'ip': u'10.10.218.108', 'name': u'SRV-CPMS10-WEB30'}, '...(remaining elements truncated)...']
    
    
    我们知道对象跨表查询可以用点,QuerySet可以使用双下划线“__”,例如获取Uhost表中所有对象的project id 和project name,可以这样做:
    
    
    >>> host2 = Uhost.objects.all().values('ip','name','project__id','project__name')
    >>> host2[0]
    	{'ip': u'10.6.13.253', 'project__name': u'CPMS10', 'name': u'dbbackupsyncer2', 'project__id': u'org-81'} 

    数据库连表操作

    一对多:

    	user_info_obj = models.UserInfo.objects.filter(id=1).first()
    	print user_info_obj.user_type
    	print user_info_obj.get_user_type_display()
    	print user_info_obj.userprofile.password
    	 
    	user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
    	print user_info_obj.keys()
    	print user_info_obj.values()
    

    多对多:

    	user_info_obj = models.UserInfo.objects.get(name=u'武沛齐')
    	user_info_objs = models.UserInfo.objects.all()
    	 
    	group_obj = models.UserGroup.objects.get(caption='CEO')
    	group_objs = models.UserGroup.objects.all()
    	 
    	# 添加数据
    	#group_obj.user_info.add(user_info_obj)
    	#group_obj.user_info.add(*user_info_objs)
    	 
    	# 删除数据
    	#group_obj.user_info.remove(user_info_obj)
    	#group_obj.user_info.remove(*user_info_objs)
    	 
    	# 添加数据
    	#user_info_obj.usergroup_set.add(group_obj)
    	#user_info_obj.usergroup_set.add(*group_objs)
    	 
    	# 删除数据
    	#user_info_obj.usergroup_set.remove(group_obj)
    	#user_info_obj.usergroup_set.remove(*group_objs)
    	 
    	# 获取数据
    	#print group_obj.user_info.all()
    	#print group_obj.user_info.all().filter(id=1)
    	 
    	# 获取数据
    	#print user_info_obj.usergroup_set.all()
    	#print user_info_obj.usergroup_set.all().filter(caption='CEO')
    	#print user_info_obj.usergroup_set.all().filter(caption='DBA')
    

    注意:xx_set中的【_set】是固定搭配,利用双下划线和 _set 将表之间的操作连接起来  

  • 相关阅读:
    基于jquery实现的文字淡入淡出效果
    js截取小数点后几位的写法
    JS获取IP、MAC和主机名的五种方法
    php checkbox复选框值的获取与checkbox默认值输出方法
    php验证复选框有效性的示例
    【Trapping Rain Water】cpp
    【Valid Sudoku】cpp
    【Permutation Sequence】cpp
    【Next Permutation】cpp
    【Remove Elements】cpp
  • 原文地址:https://www.cnblogs.com/sshcy/p/9076986.html
Copyright © 2011-2022 走看看