作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何使以下代码更高效(例如,如何用查询替换循环)?
def get_question(datetime_now, questions_queryset, user):
best_schedule = None
best_question = None
# HOW TO ELIMINATE THE FOLLOWING LOOP AND REPLACE WITH A QUERY?
for question in questions_queryset:
try:
schedule = (Schedule.objects
.filter(question=question, user=user)
.latest(field_name='datetime_added')
except ObjectDoesNotExist:
schedule = None
if (schedule and (schedule.date_show_next >= datetime_now) and
((not best_schedule) or
(schedule.datetime_added >= best_schedule.datetime_added))):
best_schedule = schedule
best_question = question
return best_question
模型.py
from django.contrib.auth.models import User
from django.db.models import DateTimeField, ForeignKey, Model, TextField
class Question(Model):
question = TextField()
class Schedule(Model):
datetime_added = DateTimeField(auto_now_add=True)
datetime_show_next = DateTimeField(null=True, default=None)
question = ForeignKey(Question)
user = ForeignKey(User, null=True)
最佳答案
您可以使用 Subquery
就像这个答案 https://stackoverflow.com/a/43883397/3627387或使用 Prefetch
https://stackoverflow.com/a/31237026/3627387
这是使用 Prefetch
实现此目的的一种方法:
schedules_prefetch = Prefetch(
'schedule_set',
queryset=Schedule.objects.filter(user=user))
for question in questions_queryset.prefetch_related(schedules_prefetch):
try:
# using max here so it wouldn't do another DB hit
schedule = max(question.schedule_set.all(),
key=lambda x: x.datetime_added)
except ValueError:
schedule = None
这是一个使用 Subquery
的示例(它可能实际上不起作用,但会给您一个大致的思路):
from django.db.models import OuterRef, Subquery
schedules = (Schedule.objects
.filter(user=user, question=OuterRef('pk'))
.order_by('datetime_added'))
questions_queryset = (questions_queryset
.annotate(latest_schedule=Subquery(schedules[:1])))
for question in questions_queryset:
schedule = question.latest_schedule
关于django - 如何消除循环中django查询的低效率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44897598/
从DDD来看,我们将数据库抽象为我们要操作的各种模型,并将其视为模型所在的存储库。然后,在其之上添加数据层和服务/业务层。我的问题是,这样做是否会通过建立胖模型而导致数据传输效率低下? 例如,假设我们
你好,对不起我的英语 我有一个类别列表和与每个类别关联的产品cats = [cat1, cat2, cat3] prod = { cat1 = [a, b, c] cat2 = [d, e, c]
我是一名优秀的程序员,十分优秀!