2013-11-12 2 views
0

Я новичок как в django, так и в python. Я пытаюсь найти лучший (наиболее эффективный) способ сделать запрос.Запись запроса ORJ django

Вот мои модели:

class Immunization(models.Model): 
    name = models.CharField(max_length=12, primary_key=True) 
    verbose_name = models.CharField(max_length=80) 
    desc = models.CharField(max_length=800) 
    effective_duration = TimedeltaField() 
    def __unicode__(self): 
     return self.name 

class Patient(models.Model): 
    name = models.CharField(max_length=64) 
    age = models.IntegerField() 
    birthday = models.DateField() 
    def __unicode__(self): 
     return self.name 

''' 
    ImmunizationRecord is a specific date an immunization was administered to a given patient. 
''' 
class ImmunizationRecord(models.Model): 
    patient = models.ForeignKey('Patient') 
    immunization = models.ForeignKey('Immunization') 
    date_administered = models.DateTimeField(auto_now_add=True) 

Запрос Я пытаюсь выполнить является:.

* Получить все Прививки, что пациент не получил в прошлом Immunizations.effective_duration *

до сих пор я делаю что-то вроде этого:

def get_context_data(self, **kwargs): 
    context = super(ProfileView, self).get_context_data(**kwargs) 

    all = Immunization.objects.all() 
    done = ImmunizationRecord.objects.filter(patient__name=self.request.user) 

    for r in done: 
     #TODO: add date check for expiry 
     all = [s for s in all if r.immunization.name != s.name] 

    context['available_list'] = all 
    return context 
+0

Вы хотите, чтобы все иммунизации были там, где дата, назначаемая меньше сегодняшней даты, больше эффективной продолжительности? – agconti

+0

Или вы хотите, чтобы все иммунизации, которые человек фактически не имеет в настоящее время? – agconti

+0

Все прививки пациент НУЖДАЕТСЯ. Так что, если они получили вакцинацию 20 дней назад, а эффективная_нукция = 19, то они просрочены на 1 день, и им НУЖНА вакцинация. – JayPrime2012

ответ

0

Что-то вроде этого может немного улучшить ситуацию.

Import numpy 
Import datetime 
recent_immunizations = ImmunizationRecord.objects.filter(patient=request.user).order_by(date_administered).reverse() 


output = [] 
for r in recent_immunization: 
    if (datetime.datetime.today() - r.date_administered) > r.immunizations.effective_duration: 
     output.append(r.immunization.name) 

Waring этот код не проверен!

+0

'effective_duration' и' name' не являются функциями. –

+0

Они связаны, и они должны быть доступны с помощью этого метода. – agconti

+0

Это не функции, а свойства. Вы получите исключение 'object is not callable'. –

0

Получить все Иммунизации, которые пациент не получал в прошлом Immunizations.effective_duration.

Все прививки пациент НУЖДАЕТСЯ. Поэтому, если они получили вакцинацию 20 дней назад, а эффективная_нукция = 19, то они просрочены на 1 день , и им НУЖНА вакцинация.

Нам нужно получить пациента; и тогда какая бы иммунизация у них не была получена. Затем нам нужно знать, какова разница в днях с сегодняшнего дня и в день введения каждой иммунизации; если эта разница меньше эффективных дней; пациент нуждается в этой иммунизации снова.

import datetime 

today = datetime.datetime.today() 

p = Patient.objects.get(pk=1) # Get some patient 
imm = ImmunizationRecord.objects.filter(patient=p) # This patient's record 

still_needed = [] 

for record in imm: 
    # How many days have passed since the immunization was administered? 
    days_since = (today - record.date_administered).days 

    if record.immunization.effective_duration < days_since: 
     still_needed.append(record.immunization) 
+0

Что делать, если они никогда не были иммунизированы раньше и нет ImmunizationRecord? Вот почему мой код сначала захватывает все Иммунизации, а затем уменьшается оттуда. – JayPrime2012

+0

Просто отфильтруйте его; 'Patient.objects.exclude (pk__in = ImmunizationRecord.objects.values_list (patient__pk, flat = True))' –

+0

В представлении показаны иммунизации, необходимые для текущего зарегистрированного пациента. Я не знаю, как быть более ясным. Ваш код, похоже, захватывает всех пациентов, которые ранее не были иммунизированы. Я согласен с тем, что вы должны сначала взять все прививки и удалить те, которые пациент уже имел в течение эффективной продолжительности иммунизации. – JayPrime2012

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