带有 Q 对象的 Django 查询?
Posted
技术标签:
【中文标题】带有 Q 对象的 Django 查询?【英文标题】:Django Query with Q object? 【发布时间】:2010-12-27 22:15:40 【问题描述】:我有模特
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.
这里有人请帮帮我吗?
【问题讨论】:
【参考方案1】:Employee_Type 应重命名为 EmployeeType。这是模型名称的 Django 约定。基础表将创建为appname_employee_type
。
对于直接的and
条件,您不需要 Q() 对象。 Q() 对象可用于or
条件,或用于组合and
s 和or
s。
那么您的查询将是:
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)
【讨论】:
感谢 celopes 的好和详细的回答。它很有用。实际上我将使用 Q(),因为我的填充器基于从请求传递的参数。 好吧,您获取参数的机制应该与您查询数据库的方式无关。虽然一直使用 Q() 对象并没有错,但是当您的条件都像您的示例中一样and
ded 时,没有理由这样做。除非您可以在某处拥有or
并且您正在动态构建查询;我不明白这一点。总是乐于提供帮助。【参考方案2】:
阅读示例http://www.djangoproject.com/documentation/models/or_lookups/
【讨论】:
【参考方案3】:如果您将 Employee_Type 重命名为 Employeetype,以下可能会起作用:
Employee.objects.filter(employeetype__name=emp_type, name__startswith=key_search, active=True)
(filter()
中可以使用多个条件,应用AND运算符。)
【讨论】:
如果没有,请尝试将employeetype_name替换为employeetype_name_exact 如果您将 Employee_Type 重命名为 Employeetype,以下可能会起作用:为什么? 下划线用于神奇的目的,我不确定在模型名称中使用它们是否可以保存。请注意我犯了一个错误,选择器应该是employeetype__name 或employeetype__name__exact(到处都是双下划线) 您可以毫无问题地使用单个下划线,尽管出于样式原因您应该避免使用它——阅读 Python PEP8 以获得首选样式。双下划线是 Django 神奇处理的。【参考方案4】:Q 对象最适合用于动态查询构建;可以在此处找到有关此主题和其他主题的 Q 对象教程:the-power-of-djangos-q-objects
【讨论】:
以上是关于带有 Q 对象的 Django 查询?的主要内容,如果未能解决你的问题,请参考以下文章