Django Model two

Django_model:

    eg:

    class XXXX(models.Model):

        nid = models.AutoField(primary_Key=True)

        name = models.CharField(max_length=32)

        age = models.IntegerField()

        authorDetail = models.OneToOneFiled(to='AuthorDetail')

        author = models.ManyToManyField(to='Author')

        publish = models.ForeignKeyField(to='Publish',to_field='nid')

    字段的选项:

        1.null 是否允许为空

        2.blank 在表单填写的时候,是否可以不填

        3.default 字段的默认值

        4.primary_Key 是否为主键

        5.unique 是否联合唯一

        6.choice 多选

    添加表记录:

        普通字段:

            1.publish_obj = Publish(name='人民出版社',city='北京')

              publish_obj.save()

            2.publish_obj = Publish.create(name='人民出版社',city='北京')

        外键字段:

            1.publish_obj = Publish.objects.filter(nid=1)[0]

              Book.objects.create(title='python',publish=publish_obj)

            2.Book.objects.create(title='python',publish_id=1)

            关键点:book_obj.publish得到的就是这本书所对应出版社的对象,可以直接调用publish的属性

        多对多字段:

            book_obj.authors.add(author_obj1,author_obj2)

            book_obj.authors.create() #创建并保存一个新的

            book_obj.authors.all() #查询所有

            book_obj.authors.remove() #将某个特定的对象删除

            book_obj.authors.clear() #清空所有关联

                两个删除方式,必须是多对多字段可以为空时,即null=True

    查询相关method:

        1.all() 查询所有

        2.filter() 获取所有过滤后的queryset

        3.get() 获取一个queryset,多余1个或者为0时报错

        4.exclude() 所给筛选条件不匹配的对象

        5.values() 返回需要的字段,以字典的形式,返回多个queryset

        6.values_list() 返回需要的字段,以元祖的形式,返回一个queryset

        7.order_by() 对查询结果排序

        8.distinct() 从返回结果中删除重复的对象

        9.reverse() 对查询结果反向排序

        10.count() 返回匹配中的个数

        11.firsr() 返回第一个

        12.last() 返回最后一个

        13.exists() 如果存在就返回True

        14.only() 查找时只取所对应的字段,而不是取所有

        15.defer() 和only相反

       

    查询:

        一对多:

            正向:book_obj.publish.city

            反向:publish_obj.book_set.title

        一对一:

            正向:author_mihon.authorDetail.telephone

            反向:authorDetail_obj.author.name

        多对对:

            同一对一

        聚合查询:

            from django.db.models import Avg,Max,Min

            Book.objects.all().agregate(avg_price=Avg('price')) -->{'avg_price':24.26}

            Book.objects.all().agregate(Avg('price'),Max('price'),Min('price'))

            {'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

        分组查询:

            book_list = Book.objects.annotate(authorNum=Count('authors')) 统计每一本书的作者数

            author_list = Author.objects.annotate(bookNum=Count('book')).filter(bookNum__gt=1) 统计出书不少于一本的作者

            book_list = Book.objects.annotate(authorNum=Count('authors')).filter(authorNum__gt=1) 统计不止一个作者的书

            book_list = Book.objects.annotate(authorNum=Count('authors')).order_by('authorNum') 根据每本书的作者数进行排序

        F查询:

            Book.objects.all().update(price=F('price')+30)

        Q查询:

            bookList = Book.objects.filter(Q(author_name='yuan')|Q(author_name='mihon'))

            动态Q查询:

                con = Q()

                q1 = Q()

                q1.connector = 'AND'

                q1.children.append(('email',value_dict['email']))

                q1.children.append(('password',value_dict['password']))

                q2 = Q()

                q2.connector = 'AND'

                q2.children.append(('email',value_dict['email']))

                q2.children.append(('email',value_dict['password']))

               

                con.add(q1,'OR')

                con.add(q2,'OR')