我有一个模特
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.
有人在这里请帮助我吗?
答案 0 :(得分:7)
应将Employee_Type重命名为EmployeeType。这是模型名称的Django约定。基础表将创建为appname_employee_type
。
对于直and
条件,您不需要Q()对象。 Q()对象对or
条件或and
和or
的组合非常有用。
然后您的查询将是:
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