当添加多个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.模型对象的数据操作方法
模型本身的概念并不难理解,但是模型使用还是需要多多练习的。