id = models.AutoField(primary_key=True)
#例如:自述名为:"person's first name"
first_name = models.CharField("person's first name", max_length=30)
#例如:自述名为:"first name"
first_name = models.CharField(max_length=30)
每个字段有一些特有的参数,例如,CharField(和它的派生类)需要max_length 参数来指定 VARCHAR 数据库字段的大小
由二元组组成的一个可迭代对象(如列表或元组),用来给字段提供选择项,如果设置了 choices, 默认的表单将是一个选择框,选择框的选择就是choices中的选项
class Test(model.Model):
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
)
test = models.CharField(max_length=5,choices=YEAR_IN_SCHOOL_CHOICES)
使用内部的class Meta 定义模型的元数据,例如:
from django.db import models
class User(models.Model):
username = models.IntegerField()
class Meta:
ordering = ["username"]
模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名 (db_table)。在模型中添加class Meta是完全可选的,所有选项都不是必须的。
class Meta:
db_table = 'server’
class Meta:
ordering = ['-order_date']
python manage.py makemigrations dashboard
会扫描和比较你当前迁移文件里面的版本,同时新的迁移文件会被创建
python manage.py sqlmigrate dashboard 0007
python manage.py migrate dashboard
all_users = User.objects.all()
Entry.objects.filter(pub_date__year=2006)
Entry.objects.all().filter(pub_date__year=2006)
查询集的筛选结果本身还是查询集,所以可以将筛选语句链接在一起。像这样:
Entry.objects.filter(
headline__startswith='What’
).exclude(
pub_date__gte=datetime.date.today()
).filter(
pub_date__gte=datetime(2005, 1, 30)
)
这个例子最开始获取数据库中所有对象的一个查询集,之后增加一个过滤器,然后又增加一个 排除,再之后又是另外一个过滤器。最后的结果仍然是一个查询集,它包含标题以”What“开 头、发布日期在2005年1月30日至当天之间的所有记录
每次你筛选一个查询集,得到的都是全新的另一个查询集,它和之前的查询集之间没有任何绑 定关系。每次筛选都会创建一个独立的查询集,它可以被存储及反复使用。
q1 = Entry.objects.filter(headline__startswith="What")
q2 = q1.exclude(pub_date__gte=datetime.date.today())
q3 = q1.filter(pub_date__gte=datetime.date.today())
查询集是惰性执行的 —— 创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整 天,直到查询集 需要求值时,Django 才会真正运行这个查询。
>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
虽然它看上去有三次数据库访问,但事实上只有在最后一行(print(q))时才访问一次数据库。 一般来说,只有在“请求”查询集 的结果时才会到数据库中去获取它们。当你确实需要结果时, 查询集 通过访问数据库来求值
one_entry = Entry.objects.get(pk=1)
可以使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子 句
>>> Entry.objects.all()[:5]
>>> Entry.objects.all()[5:10]
>>> Entry.objects.filter(pub_date__lte='2006-01-01')
SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';
>>> Entry.objects.get(headline__exact="Man bites dog")
SELECT ... WHERE headline = 'Man bites dog';
>>> Blog.objects.get(id__exact=14)
>>> Blog.objects.get(id=14)
Django 提供一个查询快捷方式pk ,它表示“primary key” 的意思
>>> Blog.objects.get(id__exact=14)
>>> Blog.objects.get(id=14)
>>> Blog.objects.get(pk=14)
Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
面的结果将按照pub_date降序排序,然后再按照headline升序排序。"-pub_date"前面 的负号表示降序排序。隐式的是升序排序。若要随机排序,请使用"?",像这样:
Entry.objects.order_by('?')
User.objects.values("id", "username")
User.objects.values_list('id', 'username')
User.objects.defer("username", "email")
Entry.objects.filter(pub_date__year=2005).delete()
blog = Blog(name='My blog', tagline='Blogging is easy')
blog.save() # blog.pk == 1
blog.pk = None
blog.save() # blog.pk == 2
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')
from django.core import serializers
data = serializers.serialize("json", SomeModel.objects.all())
from django.core import serializers
data = serializers.serialize("json", User.objects.all()[0:10], fields=('username','is_active'))
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有