django入门笔记5- model

本文详细介绍了Django中的模型定义方法,包括模型字段类型、多对多及外键关系等,并提供了实例演示如何进行数据的增删改查操作。

模型定义

       1.settings里面定义

              INSTALLED_APPS= (

                     'django.contrib.auth',

                     'django.contrib.contenttypes',

                     'django.contrib.sessions',

                     'django.contrib.sites',

                     'myapp',

              )

       2.在app中定义模型

       fromdjango.db import models

       classBook(models.Model):

              name= models.CharField(max_length=30)

              address= models.CharField(max_length=50)

              city= models.CharField(max_length=60)

              state_province= models.CharField(max_length=30)

              country= models.CharField(max_length=50)

              website= models.URLField()

              num_pages= models.IntegerField(blank=True, null=True)

             

              authors= models.ManyToManyField(Author) #多对多

              publisher= models.ForeignKey(Publisher) #外键

              publication_date= models.DateField() #时间

      

       3.检查模型的有效性

              pythonmanage.py validate

              查看生成的sql语句

              pythonmanage.py sqlall books

       4.同步DB

              pythonmanage.py syncdb

 

             

模型定义高级

       模型的默认输出:

              def__unicode__(self):

                     returnu'%s %s' % (self.first_name, self.last_name)

       模型的默认排序(在model的内部)

              classMeta:

                     ordering= ['name']

      

      

使用模型

       新建:

              方法1:

              p1= Publisher(name='Apress', address='2855 Telegraph Avenue',

                     city='Berkeley',state_province='CA', country='U.S.A.',

                     website='http://www.apress.com/')

              p1.save()

              方法2:

              p1= Publisher.objects.create(name='Apress',

                     address='2855Telegraph Avenue',

                     city='Berkeley',state_province='CA', country='U.S.A.',

                     website='http://www.apress.com/')

       查询:

              查询所有:

                     publisher_list= Publisher.objects.all()

              过滤(返回的是一个数组,可能为空)

                     Publisher.objects.filter(country="U.S.A.",state_province="CA")

              获得一个(不同于上面的是只返回一个变量,如果得到多个或者空会报错,一般查询都是会用pk=xxx):

                     Publisher.objects.get(country="U.S.A.",state_province="CA")

              模糊查询(相当于like),可以多个联合:

                     Publisher.objects.filter(name__contains="press")

              排序:

                     Publisher.objects.order_by("name")

                     Publisher.objects.order_by("-name")

                     Publisher.objects.order_by("state_province","address")

              Q表达式(主要用于复杂的逻辑判断查询,比如或查询):

                     Poll.objects.get(

                            Q(question__startswith='Who'),

                            Q(pub_date=date(2005,5, 2)) | Q(pub_date=date(2005, 5, 6))

                     )

              查询外键对象

                     b.publisher.website

                     外键对象反向访问

                     publisher.book_set.all()

              查询对对多对象

                     b.author.all()

                     反向访问

                     author.book_set.all()

             

       更改:

              方法1:

                     Publisher.objects.filter(id=52).update(name='ApressPublishing')

      

       删除:

              方法1:

              p= Publisher.objects.get(name="O'Reilly")

              p.delete()

              方法2:

              Publisher.objects.all().delete()

             

 

模型的自带方法(处理单条数据)

       1.定义:

              classPerson(models.Model):

                     birth_date= models.DateField()

                     address= models.CharField(max_length=100)

                     city= models.CharField(max_length=50)

                     state= USStateField() # Yes, this is U.S.-centric...

 

                     defbaby_boomer_status(self):

                            "Returnsthe person's baby-boomer status."

                            importdatetime

                            ifdatetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12,31):

                                   return"Baby boomer"

                            ifself.birth_date < datetime.date(1945, 8, 1):

                                   return"Pre-boomer"

                            return"Post-boomer"

       2.用法:

              p= Person.objects.get(first_name='Barack', last_name='Obama')

              p.baby_boomer_status()

 

模型的封装方法manager(处理全局返回数据)

       入门定义

              1.定义一个manager,可以直接写在model.py里:

                     classBookManager(models.Manager):

                            deftitle_count(self, keyword):

                                   **returnself.filter(title__icontains=keyword).count()

              2.在model中引用

                     classBook(models.Model):

                            num_pages= models.IntegerField(blank=True, null=True)

                            objects= BookManager()

              3.使用方式

                     Book.objects.title_count('django')

       多个manger(使用的场景应该不多):

              objects= models.Manager()

              dahl_objects= DahlBookManager()

 

             

             

附录:查询mysql的原始方式

from django.shortcuts importrender_to_response

import MySQLdb

def book_list(request):

   db = MySQLdb.connect(user='me', db='mydb', passwd='secret',host='localhost')

   cursor = db.cursor()

   cursor.execute('SELECT name FROM books ORDER BY name')

   names = [row[0] for row in cursor.fetchall()]

   db.close()

   return render_to_response('book_list.html', {'names': names})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值