Django学习笔记(第五节)模型(2)

当添加多个Publisher类并打印时,是无法区别的,为此需要为Publisher添加__unicode__()方法。

在python3.X版本中使用__str__()方法。

使用这个方法的目的是使对象使用unicode编码集,避免各种编码转换。

class Publisher(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()
    
    def __unicode__(self):
        return self.name

class Author(models.Model):
    first_name= models.CharField(max_length=30)
    last_name= models.CharField(max_length=40)
    email=models.EmailField()
    
    def __unicode__(self):
        return u'%s %s'%(self.first_name,self.last_name)

class Book(models.Model):
    title=models.CharField(max_length=100)
    #多对多
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    
    def __unicode__(self):
        return self.title


重新进入python manage.py shell ,输入下面代码:

>>> from books.models import Publisher
>>> publisher_list = Publisher.objects.all()
>>> publisher_list
输出结果将一目了然的看到每个对象是谁。


插入和更新数据

之前已经提到save()方法用于保存数据,实际上当时的用法就相当于SQL的insert方法,

在更新数据时也使用save()方法,例如:

>>> p.name = 'Apress Publishing'
>>> p.save()

在这里save() 方法相当于SQL的update语句。这里更新了name字段。

但是save()方法并不是只更新了name字段,而是将所有字段都更新了,只是name字段有与之前相比变动。


查询在前面已经提到过,Publisher.objects.all()相当于select方法。

数据过滤

通常我们很少需要把所有数据都查询出来,在Django API中可以使用filter()方法对数据进行过滤:

>>> Publisher.objects.filter(name='Aptess')

filter()方法相当于SQL中的where条件。可以传递多个条件,中间用逗号分隔。


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

name__contains相当于SQL中的like语句,where name like '%press%'


>>> filter()方法返回一个列表,使用get方法代替filter方法就可以获得单个对象,但是查询结果有多个或者没有结果就会抛出异常。

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


 order_by()方法用于排序,相当于SQL的order by,方法传递多个参数时,将对多个字段进行排序。

>>> Publisher.objects.order_by("name")

当然Django也可以指定模型的默认排序方式:

class Publisher(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()

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['name']

通过以上方法,基本已经可以写出一个带有条件的查询语句,使用链式语句:

>>> Publisher.objects.filter(country="U.S.A.").order_by("-name")

限制返回的数据

由于filter返回的是列表,所有实用标准的Python列表切片即可实现SQL的limit语句,如:

>>> Publisher.objects.order_by('name')[0:2]

相当于SQL语句:

SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name
OFFSET 0 LIMIT 2;
但是不支持负索引。

更新多个对象

对filter的结果集调用update方法就可以高效的更新某字段的数据,并且不会引发竞态条件。

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')

相当于sql语句:

UPDATE books_publisher SET name = 'Apress Publishing' WHERE id = 52;

删除对象

同上面的update方法,对查询的结果集调用delete方法即可进行删除。

需要注意的是Django为了预防误删除某表的全部数据,要求清除表数据时必须调用all()方法,然后在调用delete方法。

>>> Publisher.objects.filter(country='USA').delete()
>>> Publisher.objects.all().delete()
>>> Publisher.objects.all()


至此关于Django模型的内容已经大体学习完成。

模型这部分涉及到了如下一些内容:

1.MVC模式

2.Django APP

3.模型的创建

4.模型对象的数据操作方法


模型本身的概念并不难理解,但是模型使用还是需要多多练习的。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值