python数据库模型总结

先看一下数据库模型之间的对应关系:
[color=blue][size=medium]Author[/size][/color] [color=darkred][size=medium]n:n[/size][/color] [color=blue][size=medium]Book[/size][/color] [color=darkred][size=medium]n:1[/size][/color] [color=blue][size=medium]Publisher[/size][/color]
然后看看在python项目中的models.py中如何表示:

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

class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField(blank=True,verbose_name='e-mail')

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField(blank=True, null=True)

下面看看如何插入数据:
方法一:

p1 = Publisher(name='Addison-Wesley', address='75 Arlington Street',city='Boston', state_province='MA', country='U.S.A.',website='http://www.apress.com/')
p1.save()

方法二:

p1 = Publisher.objects.create(name='Apress',address='2855 Telegraph Avenue',city='Berkeley', state_province='CA', country='U.S.A.',website='http://www.apress.com/')

更新数据:
方法一:

p1.name = 'Apress Publishing'
p1.save()

方法二:

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


[color=red]注意:
第一种方法更新数据库中所有的字段,
生成数据库语句是:
UPDATE book_publisher SET 
name = 'Apress Publishing',
address = '2855 Telegraph Ave.',
city = 'Berkeley',
state_province = 'CA',
country = 'U.S.A.',
website = 'http://www.apress.com'
WHERE id = 52;


第二种数据库语句是:
UPDATE books_publisher 
SET name = 'Apress Publishing'
WHERE id = 52;
[/color]

更新所有记录

Publisher.objects.all().update(country='USA')


下面是选择对象:

Publisher.objects.all() 选择所有
Publisher.objects.filter(name= ‘ Apress ’ ) 数据过滤
Publisher.objects.filter(name__contains="press")
Publisher.objects.get(name= “ Apress ” ) 获取单个对象


[color=red]
[size=medium]注意: filter()`` 函数返回一个记录集,这个记录集是一个列表 QuerySet 。相对列表来说,有些时候我们更需要获取单个的对 象, 用 `` get()`` 方法。
Get ()方法:
如果结果是多个对象,会导致抛出异常;
如果查询没有返回结果也会抛出异常。

contains转换成数据库语句是like [/size]
[/color]

下面是删除对象:
p = Publisher.objects.get(name="dddddddddddd") 
p.delete()

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


下面是访问外键---一对多访问:
b = Book.objects.get(id= 1 ) 
b.publisher
b.publisher.website

访问外键---多对一访问:
p = Publisher.objects.get(name='Apress Publishing') 
p.book_set.all()
p.book_set.filter(name__icontains='django')

访问外键---多对多访问:
b = Book.objects.get(id= 2 ) 
b.authors.all()
b.authors.filter(first_name='Adrian')
b.authors.filter(first_name='Adam')

访问外键---多对多访问(反向):
a = Author.objects.get(first_name='Adrian', last_name='Holovaty') 
a.book_set.all()


[color=red][size=large]大家可能纳闷什么时候用xxx_set来得到想要的对象呢?
其实可以回去看看models.py,其中book中有这两句:
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)

所以当模型中有约束则用b.publisher和b.authors.all(),相反模型中没有约束就用a.book_set.all()等。 [/size][/color]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值