【问题标题】:Django Query with Q object?带有 Q 对象的 Django 查询?
【发布时间】: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.

这里有人请帮帮我吗?

【问题讨论】:

    标签: django django-q


    【解决方案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】:
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2015-06-23
      • 2014-02-06
      • 2015-07-15
      • 2013-02-27
      • 2021-09-15
      • 2013-12-11
      • 2014-03-22
      相关资源
      最近更新 更多