首页 > 解决方案 > 如何使用以下 2 个表中的字段从表中搜索数据

问题描述

所以,也许我的问题不够清楚......我会尝试在例子中展示它。

我有 3 个表:models.py

class Department(models.Model):
    department = models.CharField(max_length=100)
    activate = models.BooleanField(default=True)

    def __str__(self):
        return self.department


class Employee(models.Model):
    noEmployee = models.DecimalField(max_digits=8, decimal_places=0, default=10) #
    name = models.CharField(max_length=50)
    surname = models.CharField(max_length=100)
    department = models.ForeignKey(Department, on_delete=models.CASCADE, default=1)
    activate = models.BooleanField(default=True)

    def __str__(self):
        return str(self.noEmployee)


class List_of_tasks(models.Model):
    myData = datetime.now()
    formatedDate = myData.strftime("%Y-%m-%d")

    task = models.CharField(max_length=250)
    description = models.TextField(blank=True, null=True)
    responsible = models.ForeignKey(Employee, on_delete=models.CASCADE, default=1)
    start_date = models.DateField('Start date', default=formatedDate)
    finish_date = models.DateField('Finish date', default=formatedDate)
    finished = models.BooleanField(default=False)

    def __str__(self):
        return self.task

还有views.py中的一个小功能

def filter(request):
    qs = List_of_tasks.objects.all()
    task_query = request.GET.get('task_contains')
    department_query = request.GET.get('department_contains')

    print(task_query)
    if department_query is not None:
        dep = Employee.objects.filter(department__department__icontains=department_query)

        for d in dep:
            print('department: ', d.noEmployee, d.name, d.surname)

        for d in dep:
            dep2 = List_of_tasks.objects.filter(responsible__noEmployee__exact=d.noEmployee)
            for d2 in dep2:
                print('Tasks: ', d2.task, d2.responsible)

    if is_valid_queryparam(task_query):
        qs = qs.filter(task__icontains=task_query)

    context = {'queryset': qs,}

    return render(request, 'appl01/export.html', context)

在 List_of_tasks 表中查找 TASKS 或RESPONSIBLE人员很容易,但我想找到例如分配给部门的所有任务......两个表下来......

如您所见,我创建了自己的方法,该方法可以按我的意愿工作,但效率不高。如果表 Employee 或 List_of_tasks 中有很多记录,则此搜索非常慢。

...
for d in dep:
    dep2 = List_of_tasks.objects.filter(responsible__noEmployee__exact=d.noEmployee)
    for d2 in dep2:
        print('Tasks: ', d2.task, d2.responsible)
...

问题是:
我怎样才能做得更好?

感谢您的任何建议..

标签: pythondjangodjango-viewsdjango-templates

解决方案


要查找分配给部门的所有任务,您可以执行以下操作:

tasks = List_of_tasks.objects.select_related('responsible').filter(responsible__department__department__icontains=department_query)

for t in tasks:
     print(t.task, t.responsible.noEmployee, t.responsible.name, t.responsible.surname)

推荐阅读