ORM查看SQL代码
>>> queryset = Event.objects.all()
>>> str(queryset.query)
SELECT "events_event"."id", "events_event"."epic_id",
"events_event"."details", "events_event"."years_ago"
FROM "events_event"
怎么用UUID做为主键,而不是用自增ID做主键
import uuid
from django.db import models
class Event(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
details = models.TextField()
years_ago = models.PositiveIntegerField()
>>> eventobject = Event.objects.all()
>>> eventobject.first().id
'3cd2b4b0c36f43488a93b3bb72029f46'
null=True
和blank=True
的区别
date = models.DateTimeField(null=True)
在数据库中的存的数据是NULL
title = models.CharField(blank=True)
在数据库中存的数据是空字符。
如何指定模型字段名
class ColumnName(models.Model):
a = models.CharField(max_length=40,db_column='column1')
column2 = models.CharField(max_length=50)
def __str__(self):
return self.a
为模型指定表名
class TempUser(models.Model):
first_name = models.CharField(max_length=100)
. . .
class Meta:
db_table = "temp_user"
或查询
# 方法一:
from django.db.models import Q
qs = User.objects.filter(Q(first_name__startswith='R')|Q(last_name__startswith='D'))
# 方法二:
queryset = User.objects.filter(
first_name__startswith='R'
) | User.objects.filter(
last_name__startswith='D'
)
并查询
# 方法一:
queryset_1 = User.objects.filter(
first_name__startswith='R',
last_name__startswith='D'
)
# 方法二:
queryset_2 = User.objects.filter(
first_name__startswith='R'
) & User.objects.filter(
last_name__startswith='D'
)
# 方法三:
queryset_3 = User.objects.filter(
Q(first_name__startswith='R') &
Q(last_name__startswith='D')
)
非查询
exclude(<condition>)
filter(~Q(<condition>))
如何从相同或不同的Model中联合两个查询集
注意:联合的查询集必须有相同的字段。
>>> q1 = User.objects.filter(id__gte=5)
>>> q1
<QuerySet [<User: Ritesh>, <User: Billy>, <User: Radha>, <User: sohan>, <User: Raghu>, <User: rishab>]>
>>> q2 = User.objects.filter(id__lte=9)
>>> q2
<QuerySet [<User: yash>, <User: John>, <User: Ricky>, <User: sharukh>, <User: Ritesh>, <User: Billy>, <User: Radha>, <User: sohan>, <User: Raghu>]>
>>> q1.union(q2)
<QuerySet [<User: yash>, <User: John>, <User: Ricky>, <User: sharukh>, <User: Ritesh>, <User: Billy>, <User: Radha>, <User: sohan>, <User: Raghu>, <User: rishab>]>
>>> q2.union(q1)
<QuerySet [<User: yash>, <User: John>, <User: Ricky>, <User: sharukh>, <User: Ritesh>, <User: Billy>, <User: Radha>, <User: sohan>, <User: Raghu>, <User: rishab>]>
Now try this
如何仅在查询集中选择某些字段
方法一:
>>> queryset = User.objects.filter(
first_name__startswith='R'
).values('first_name', 'last_name')
>>> queryset
<QuerySet [{'first_name': 'Ricky', 'last_name': 'Dayal'}, {'first_name': 'Ritesh', 'last_name': 'Deshmukh'}, {'first_name': 'Radha', 'last_name': 'George'}, {'first_name': 'Raghu', 'last_name': 'Khan'}, {'first_name': 'Rishabh', 'last_name': 'Deol'}]
方法二:
queryset = User.objects.filter(
first_name__startswith='R'
).only("first_name", "last_name")
str(queryset.query)
输出以下内容:
SELECT "auth_user"."id", "auth_user"."first_name", "auth_user"."last_name"
FROM "auth_user" WHERE "auth_user"."first_name"::text LIKE R%
values
和only
的区别,only
比values
多拿了id
如何在Django中执行子查询表达式
>>> from django.db.models import Subquery
>>> users = User.objects.all()
>>> UserParent.objects.filter(user_id__in=Subquery(users.values('id')))
<QuerySet [<UserParent: UserParent object (2)>, <UserParent: UserParent object (5)>, <UserParent: UserParent object (8)>]>
如何查找是否有重复字段的行
duplicates = User.objects.values(
'first_name'
).annotate(name_count=Count('first_name')).filter(name_count__gt=1)
查找没有重复的字段
distinct = User.objects.values(
'first_name'
).annotate(
name_count=Count('first_name')
).filter(name_count=1)
records = User.objects.filter(first_name__in=[item['first_name'] for item in distinct])
从模型中随机返回对象
Category.objects.order_by("?").first()
如何一次创建多个对象
Category.objects.bulk_create(
[Category(name="God"),
Category(name="Demi God"),
Category(name="Mortal")]
)
单例
class Origin(models.Model):
name = models.CharField(max_length=100)
def save(self, *args, **kwargs):
if self.__class__.objects.count():
self.pk = self.__class__.objects.first().pk
super().save(*args, **kwargs)
字符串时间转成时间格式存到数据库
# 方法一:
user = User.objects.get(id=1)
date_str = "2018-03-11"
from django.utils.dateparse import parse_date
temp_date = parse_date(date_str)
a1 = Article(headline="String converted to date", pub_date=temp_date, reporter=user)
a1.save()
# 方法二:
from datetime import datetime
temp_date = datetime.strptime(date_str, "%Y-%m-%d").date()
a2 = Article(headline="String converted to date way 2", pub_date=temp_date, reporter=user)
a2.save()
排序
User.objects.all().order_by('date_joined') # For ascending
User.objects.all().order_by('-date_joined') # For descending
# 多字段排序
User.objects.all().order_by('date_joined', '-last_login')
# 关联表排序
class Category(models.Model):
name = models.CharField(max_length=100)
class Hero(models.Model):
# ...
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
Hero.objects.all().order_by(
'category__name', 'name'
)
自关联
class Employee(models.Model):
manager = models.ForeignKey('self', on_delete=models.CASCADE)
数据库反向生成ORM
python manage.py inspectdb > models.py