带有 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 条件,或用于组合ands 和ors。

那么您的查询将是:

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() 对象并没有错,但是当您的条件都像您的示例中一样 andded 时,没有理由这样做。除非您可以在某处拥有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 查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有外键的 Q 对象定义 django 查询集

带有Q和多个类别的django查询

带有数据库查询的 Django charfield 模型

带有查询分页的 Django 搜索页面

Django Q 对象(复杂查询)是不是安全?

Django篇之F,Q