Django Query с объектом Q? - PullRequest
       20

Django Query с объектом Q?

1 голос
/ 18 декабря 2009

У меня есть модель

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.

Кто-нибудь здесь, пожалуйста, помогите мне?

Ответы [ 4 ]

7 голосов
/ 18 декабря 2009

Employee_Type должен быть переименован в EmployeeType. Это соглашение Django для названий моделей. Базовая таблица будет создана как appname_employee_type.

Вам не нужны объекты Q () для прямых and условий. Объекты 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 голос
/ 18 декабря 2009
1 голос
/ 18 декабря 2009

если вы переименуете Employee_Type в Employeetype, может сработать следующее:

Employee.objects.filter(employeetype__name=emp_type, name__startswith=key_search, active=True)

(вы можете использовать несколько условий в filter(), применяется оператор AND.)

0 голосов
/ 20 октября 2011

Q объектов лучше всего использовать для динамического построения запросов; руководство по объектам Q, охватывающее эту и другие темы, можно найти здесь: the-power-of-djangos-q-objects

...