从Django模型加载表中的所有数据,并从中运行查询

时间:2019-02-22 06:33:33

标签: django django-models

我想知道如何在完全加载到内存中后如何从数据中运行查询,以防止它每次都访问数据库

这是我的模特

class empdb(models.Model):
    empid   = models.CharField(max_length=8,primary_key=True)
    empname = models.CharField(max_length=255)
    empdept = models.CharField(max_length=255)
    class Meta:
        ordering = ('empid',)
    def __str__(self):
        return self.empid

这就是我正在尝试的

record = empdb.objects.all()   ' This will load all data in "record"

现在如何根据我们的查询从中读取并提取数据

我正尝试在下面的查询中查找哪些员工属于人事部门

   dataset=backuprecord.filter(empdept='HR')
   print(dataset)

现在这就是我被困住的地方。我得到的输出很好,它确实列出了我得到的数据,但格式如下:

<QuerySet [<empid: 10010>,<empid: 10121>,<empid: 12235>,<empid: 18110>]>

我想从上面的查询集中提取出Empid和empname

我该怎么做?

我想要的是下面变量中的数据

for i  in <length of query set> 
    foundempid[i] =  ''' The Employee ID from the queryset Line 
    foundempname[i] = ''' The Employee Name

任何帮助,将不胜感激。

5 个答案:

答案 0 :(得分:1)

dataset=backuprecord.filter(empdept='HR')

dataset中,您将得到queryset。 Django进行数据库查询,并使用ORM将其转换为Model实例。实例的集合称为查询集。现在,当您要获取模型实例(表中的一行中的ORM)时,可以执行many ways。在这里,如果要访问dataset中的所有对象,则可以简单地循环访问它,并且像每个对象一样,可以通过<object>.attribute_name获取值。例如:

dataset=backuprecord.filter(empdept='HR')

for data in dataset:
   print(data.emdid)
   print(data.empname)

答案 1 :(得分:0)

dataset=empdb.objects.filter(empdept='HR').values('empdid','empname')
for data in dataset:
    print data['empdid'], data['empname']

我建议您以大写字母开头一个类名,因为这是标准的做法。例如,将类名命名为class Empdb

答案 2 :(得分:0)

您可以像这样使用values函数。

empdb.objects.filter(your_filter_params).values('empid', 'empname')

这将为您提供词典列表。

  

[{'empid':1212,'empname':'Name'},{'empid':1212,'empname':'Name'}]

您可以像这样以列表形式获取它。

empids = empdb.objects.filter(your_filter_params).values_list('empid', flat=True)
empnames = empdb.objects.filter(your_filter_params).values_list('empname', flat=True)

答案 3 :(得分:0)

.all()在这里record = empdb.objects.all()是多余的,您可以直接执行empdb.objects.filter(empdept='HR'),而无需在这里获取所有内容然后进行查询

empdb.objects.filter(empdept="HR").values('empid)获取所需的值,或者values()获取字典中的所有数据

答案 4 :(得分:0)

我认为这就是你的做法。

dataset= empdb.objects.filter(empdept='HR').value_list('empid','empname')

zipped_data = zip(range(len(dataset)),dataset) #python 2.7
zipped_data = list(zip(range(len(dataset)),dataset)) #python 3.6

for i, data  in zipped_data: 
    foundempid[i] =  data[0] The Employee ID from the queryset Line 
    foundempname[i] = data[1] The Employee Name

如果遇到任何问题,请告诉我。