使用Q对象进行Django查询?

kn3*_*n3l 1 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) 
Run Code Online (Sandbox Code Playgroud)

我需要查询这样的事情:

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

问题:对

Q(type__= emp_type) (type = models.ForeignKey(Employee_Type)) I cannot do this.
Run Code Online (Sandbox Code Playgroud)

这里有人请帮帮我?

cet*_*eek 7

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

对于直线and条件,您不需要Q()对象.Q()对象对or条件或组合ands和ors 很有用.

那么你的查询将是:

employees = Employee.objects.filter(name__startswith=key_search, 
                                    type=emp_type, 
                                    active=True)                            
Run Code Online (Sandbox Code Playgroud)

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

employees = Employee.objects.filter(name__startswith=key_search, 
                                    type__name=emp_type, 
                                    active=True)                            
Run Code Online (Sandbox Code Playgroud)