删除Django查询Image SQL duplicate中的重复项.我使用了SELECT_Related,并将请求数量从90个减少到18个,但是如果数据库增长,那么这并不能挽救我的生命.如何改进查询?

views.py

def index(request):  
    snj = ScheduleNotJob.objects.select_related()
    form = SNJ()
    return render(request,"index.html",{'snj': snj, 'form':form})  
models.py



class Office(models.Model):  
    title = models.CharField(max_length=150, db_index=True)  

    def __str__(self):
        return self.title
            

class Post(models.Model):
    office = models.ForeignKey(Office, on_delete=models.CASCADE)  
    title = models.CharField(max_length=150, db_index=True)

    def __str__(self):
        return self.title


class Human(models.Model):  
    office = models.ForeignKey(Office, on_delete=models.CASCADE)  
    post = ChainedForeignKey(
        Post, 
        chained_field="office",
        chained_model_field="office", 
        show_all=False, 
    )  
    initials = models.CharField(max_length=150, db_index=True)  


    def __str__(self):
        return self.initials


class Reason(models.Model):  
    title = models.CharField(max_length=150) 

    def __str__(self):
        return self.title


class Shift(models.Model):  
    title = models.CharField(max_length=150) 

    def __str__(self):
        return self.title
    

class ScheduleNotJob(models.Model):
    shift = models.ForeignKey(Shift, on_delete=models.CASCADE) 
    office = models.ForeignKey(Office, on_delete=models.CASCADE) 
    post = GroupedForeignKey(Post, "office") 
    human = GroupedForeignKey(Human, "post") 
    reason = models.ForeignKey(Reason, on_delete=models.CASCADE)
    comment = models.CharField(max_length=300, blank=True, null=True)
    length_time = models.IntegerField(blank=True, null=True)
    date_start = models.DateField(blank=True, null=True) 
    date_end = models.DateField(blank=True, null=True) 
index.html


{% for elem in snj %}  
    <tr class="mySelect">  
    <td>{{ elem.id }}</td>  
    <td>{{ elem.shift }}</td> 
    <td>{{ elem.office }}</td> 
    <td>{{ elem.post }}</td> 
    <td>{{ elem.human }}</td>  
    <td>{{ elem.reason }}</td>  
    <td>{{ elem.comment }}</td> 
{% endfor %}

我使用了SELECT_Related,并将请求数量从90个减少到18个,但是如果数据库增长,那么这并不能挽救我的生命.如何改进查询?

推荐答案

您可以使用Only()方法并传递必需的字段,这些字段在计算查询集时立即加载.

def index(request):  
    snj = ScheduleNotJob.objects.select_related(
        'shift', 'office', 'post', 'human'
    ).only(
        'id', 'reason', 'comment', 'shift_id', 'shift__title', 'office_id', 'office__title', 'post_id', 'post__title', 'human_id', 'human__initials'
    )
    form = SNJ()
    return render(request,"index.html",{'snj': snj, 'form':form})

Django相关问答推荐

仅更新模型中的特定字段.Model Django

Djnago admin中 Select 字段的自定义查询

如何在Django REST框架中使用FactoryBoy创建不同的项目

Django:作为模型中的列表元素的字段

Django-admin 显示decorator 按多列排序

通过 B 的外键列表访问模型 B 的行

错误``Forbidden (403) CSRF 验证失败.请求中止.``` 当try 登录管理员时

Django 按月分组并按月显示在模板中

Nginx 响应 404 not found on Django media URL in preprod, dev ok

Django Query 在基于通用类的 UpdateView 中重复了 2 次

在 settings.py 中指定 Django 测试数据库名称

Django - 将 HTML 输出转换为变量

Django rest框架覆盖ViewSet中的page_size

删除所有实例后,Django 模型实例主键不会重置为 1

Python Django 模板和测试变量是否为空或空字符串

Matplotlib - Tcl_AsyncDelete:异步处理程序被错误的线程删除?

如何在不发送信号的情况下保存模型?

Django 自定义用户邮箱帐户验证

为整个结果集向 Django Rest Framework 结果添加额外数据

确保只有一个工作人员在运行多个工作人员的 pyramid 网络应用程序中启动 apscheduler 事件