使用Q对象进行Django查询?

时间:2009-12-18 04:06:55

标签: django django-q

我有一个模特

class Employee_Type(models.Model):
    def __unicode__(self):
        return self.name
    name = models.CharField(max_length=200, verbose_name="employee type")

class Employee(models.Model):
    def __unicode__(self):
        return self.name
    name = models.CharField(max_length=200)
    type = models.ForeignKey(Employee_Type)
    address = models.CharField(max_length=500,blank=True, null=True)
    telephone = models.CharField(max_length=100, blank=True, null=True)
    fax = models.CharField(max_length=100, blank=True, null=True)
    email = models.EmailField(max_length=200, blank=True, null=True)
    active = models.BooleanField(default=True) 

我需要查询这样的内容:

 employees = Employee.objects.filter(
                            Q(name__startswith=key_search) \
                            & Q(type__icontian= emp_type)#CAN I DO THIS?
                            Q(active=True)                            
                            )

问题:对于

Q(type__= emp_type) (type = models.ForeignKey(Employee_Type)) I cannot do this.

有人在这里请帮助我吗?

4 个答案:

答案 0 :(得分:7)

应将Employee_Type重命名为EmployeeType。这是模型名称的Django约定。基础表将创建为appname_employee_type

对于直and条件,您不需要Q()对象。 Q()对象对or条件或andor的组合非常有用。

然后您的查询将是:

employees = Employee.objects.filter(name__startswith=key_search, 
                                    type=emp_type, 
                                    active=True)                            

当然,假设变量emp_type包含EmployeeType的实例。如果emp_type表包含员工类型的名称,请使用:

employees = Employee.objects.filter(name__startswith=key_search, 
                                    type__name=emp_type, 
                                    active=True)                            

答案 1 :(得分:1)

如果您将Employee_Type重命名为Employeetype,则以下操作可能有效:

Employee.objects.filter(employeetype__name=emp_type, name__startswith=key_search, active=True)

(您可以在filter()中使用多个条件,并应用AND运算符。)

答案 2 :(得分:1)

答案 3 :(得分:0)

Q对象最适合用于动态查询构建;有关此主题和其他主题的Q对象教程可在此处找到:the-power-of-djangos-q-objects

相关问题