2015-02-03 4 views
0

Я хочу сделать запрос внутри класса моей модели. У меня есть следующая модель, где заключен договор, когда у человека есть проект.Django: Сделать запрос внутри класса

class Person(models.Model): 
    name = models.CharField(max_length=32) 
    surname = models.CharField(max_length=32) 
    address = models.CharField(max_length=32) 
    is_doctor = models.NullBooleanField(blank=True, verbose_name=_(u"Phd?") 

class Project(models.Model): 
    name     = models.CharField(max_length=32, verbose_name=_(u"Name")) 
    principal_researcher = models.ForeignKey(Person, blank = True, verbose_name=_(u"Researcher associated with the project")) 

class Contract(models.Model): 
    person  = models.ForeignKey(Person) #person hired 
    project  = models.ForeignKey(Project, blank = True, null = True) #related project 
    type_contract = models.CharField(max_length = 9, blank = True, verbose_name = _(u"Type of contract(Full time/grant/Partial time...)")) 
    starting_date = models.DateField(blank = True, null = True) 
    ending_date = models.DateField(blank = True, null = True) 
    term   = models.CharField(max_length = 120, blank = True) 

Я хочу создать класс, где пользователь сможет сделать этот запрос:

Назови мне все люди, без Phd, с полным договором времени с договором между двумя датами.

Таким образом, пользователю необходимо ввести две даты, чтобы получить запрос.

(Все это из интерфейса администратора)

ответ

0

Я не знаю, что вы подразумеваете под «внутри класса».

Вы можете сделать запрос, как это:

Person.objects.filter(
    is_doctor=False, 
    contract__type_contract='full', 
    contract__starting_date__gte=start_date, 
    contract__ending_date__lte=end_date 
) 

Если вы хотите, чтобы определить способ выполнения этого запроса, который обычно делается внутри модели менеджера:

class PersonManager(models.Manager): 
    def full_time_no_doctors_contract_between(self, start_date, end_date): 
     return self.filter(...) 


class Person(models.Model): 
    ... 
    objects = PersonManager() 

и теперь вы может делать:

Person.objects.full_time_no_doctors_contract_between(start_date, end_date) 
+0

Большое спасибо @ Daniel Что я имел в виду под «внутри класса», было то, что я хочу, чтобы пользователь перешел в класс в A dmin, введите две даты и результат будет показан отдельно от класса Person. Поэтому я не знаю, как это сделать. Куда бы я поместил ?: Person.objects.full_time_no_doctors_contract_between (start_date, end_date) – loar

Смежные вопросы