标签:
Django 模型(model)
1.对应关联关系,多对多[many-to-many] 一对一[one-to-many] ,也叫做外键 foreignkey
一本书有一个或多个作者,和作者的关系是多对多的关联关系[many-to-many]和出版商的关系是一对多[one-to-many]
class Book(models.Model): title=model.CharField(max_length=100) authors=models.ManyToManyField(Author) publisher=models.ForeignKey(Pulisher)
每个模型相当与于单个数据库表,每个属性也是这个表中的一个字段.属性名就是字段名,它的类型就相当于数据库的字段类型
"每个数据库表对应一个类"这条规则的例外情况是多对多关系,在上面的模型中,Bokk有一个多对多字段,叫做auhtors,该字段表明一本书有多个作者,但book数据库中却并没有authors字段,相反,Django创建了一个额外的表(多对多链接表)来处理书和作者的映射关系,
每个新闻对应多个标签----新闻-标签链接表??那在哪呢??
2. 模型安装
激活这个模型,找到setting.py文件,找到INSTALLED_APPS设置,这个设置告诉Django哪些app处于激活状态
遇到一个错误,原始是所有的modles里面的函数都必须有原括号打少一个news_date=models.DateField()
TypeError: Error when calling the metaclass bases unbound method contribute_to_class() must be called with DateField instance as first argument (got ModelBase instance instead)
3.检验模型有效性代码:
python manage.py validate
生成create table 语句,mysie是app名,但是因为我的是migrate不行 - -
python manage.py sqlall mysite
同步到数据库中,因为syncdb命令不可以用,这里必须用makemigration 和 migrate
Run ‘manage.py makemigrations‘ to make new migrations, and then re-run ‘manage.py migrate‘ to apply them. $ python manage.py makemigrations Migrations for ‘mysite‘: 0001_initial.py: - Create model Article - Create model Tag - Create model User $ python manage.py migrate Operations to perform: Apply all migrations: mysite Running migrations: Applying mysite.0001_initial... OK
4.基本数据访问
>>> from books.models import Publisher >>> p1 = Publisher(name=‘Apress‘, address=‘2855 Telegraph Avenue‘, ... city=‘Berkeley‘, state_province=‘CA‘, country=‘U.S.A.‘, ... website=‘http://www.apress.com/‘) >>> p1.save() >>> p2 = Publisher(name="O‘Reilly", address=‘10 Fawcett St.‘, ... city=‘Cambridge‘, state_province=‘MA‘, country=‘U.S.A.‘, ... website=‘http://www.oreilly.com/‘) >>> p2.save() >>> publisher_list = Publisher.objects.all() >>> publisher_list [<Publisher: Publisher object>, <Publisher: Publisher object>]
5.显示对象的问题,
[<Publisher: Publisher object>, <Publisher: Publisher object>]看不出东西
,只需要为 Publisher 对象添加一个方法 __unicode__() 。 __unicode__() 方法告诉Python如何将对象以unicode的方式显示出来。 为以上三个模型添加 __unicode__() 方法后,就可以看到效果了:
def __unicode__(self): return self.headline
6.对数据库操作:
b=Book(title="bigbang", author="GD",)
b.save()
b.title="TOP",修改
b.save()
Book.objects.all()
[<Book: bigbang>,<Book:b2>]
Book.objects.filter(titile=‘bigbang‘)
Publisher.objects.filter(name_contains="press")
变量_contain可以用来寻找包含这个字段的,比如Appress
还有其他查找:
incontains(无关大小写) startwith 和 endwith, 还有range
Book.objects.get(name="Apress") <Publisher:Apress>
>>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O‘Reilly>]
对多个字段排序(第二个字段会在第一个字段的值相同的情况下被使用到)
>>> Publisher.objects.order_by("state_province", "address") [<Publisher: Apress>, <Publisher: O‘Reilly>]
我们还可以指定逆向排序,在前面加一个减号 ‐ 前缀:
>>> Publisher.objects.order_by("‐name") [<Publisher: O‘Reilly>, <Publisher: Apress>]
尽管很灵活,但是每次都要用 order_by() 显得有点啰嗦。 大多数时间你通常只会对某些 字段进行排序。 在这
种情况下,Django让你可以指定模型的缺省排序方式:
现在,让我们来接触一个新的概念。 class Meta ,内嵌于 Publisher 这个类的定义中(如果 class Publisher
是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统 )。你可以在任意一个 模型 类中
使用 Meta 类,来设置一些与特定模型相关的选项
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") [<Publisher: O‘Reilly>, <Publisher: Apress>]
>>> Publisher.objects.order_by(‘name‘)[0] <Publisher: Apress>
>>> p = Publisher.objects.get(name="O‘Reilly") >>> p.delete() >>> Publisher.objects.all() [<Publisher: Apress Publishing>]
标签:
原文地址:http://www.cnblogs.com/zzblee/p/4260815.html