2016-02-10 2 views
0

Я начал проект с django1.9 и python-3.4.4. Я создал приложение, чтобы отслеживать потребление энергии, воды и газа. Я начал этот проект, чтобы лучше узнать django и python.Расчет Django на основе значений формы и базы данных

Я создал форму, где у меня есть два поля. Один для типа счетчика и один для значения. Теперь я хочу получить последнее значение из базы данных и сделать простой расчет.

delta = value_db - value_form 

models.py

class Verbraucher(models.Model): 
    Id = models.AutoField(primary_key=True) 
    Typ = models.CharField(max_length=50) 
    Nummer = models.CharField(max_length=50, unique=True) 

def __str__(self): 
    return format(self.Typ) 


class Daten(models.Model): 
    Daten_id = models.AutoField(primary_key=True) 
    Verbraucher = models.ForeignKey(Verbraucher) 
    Stand = models.DecimalField(max_digits=10, decimal_places=3) 
    Verbrauch = models.DecimalField(max_digits=10, decimal_places=3) 
    Zeitstempel = models.DateTimeField(auto_now=True, auto_now_add=False) 
    Updatestempel = models.DateTimeField(auto_now=False, auto_now_add=True) 

    def __str__(self): 
     return format(self.Zeitstempel) 

forms.py

class DatenForm(forms.ModelForm): 
    class Meta: 
     model = Daten 
     fields = ['Verbraucher', 'Stand'] 

views.py

def dateneingabe(request): 
    if request.method == "GET": 
     form = DatenForm() 
     return render(request, 'verbrauch/eingabe.html', {'form': form}) 
    elif request.method == "POST": 
     form = DatenForm(request.POST) 
     model = Daten() 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      Stand_db = Daten.objects.lastest(Verbraucher) 
      instance.Verbrauch = do_calc(Stand - Stand_db) 
      instance.save() 
      return HttpResponseRedirect('/') 

Я пробовал разные способы, но ни один из них не работает. Надеюсь, что у кого-то есть идея помочь мне! Большое спасибо!

EDIT:

Вся идея его ист иметь локальный веб-сайт, где у вас есть небольшой вид двух полей. Один для типа счетчика и один для значения, которое он имеет сегодня. Впоследствии я хочу получить последнее значение из базы данных этого счетчика и вычесть бота. Затем вычисленное значение должно быть вставлено в db. Надеюсь, это поможет ?!

EDIT2:

Я поиграл немного araound и обнаружил ошибку. Получаю, если я хочу сделать расчет. unsupported operand type(s) for -: 'decimal.Decimal' and 'Daten' Странная вещь, что я определил как в качестве знаков после запятой в моем файле модели ... Это код (views.py после формы = DatenForm (request.POST)): if form.is_valid(): instance = form.save(commit=False) Stand = form.cleaned_data['Stand'] print(Stand) Stand_db = Daten.objects.latest('Stand') print(Stand_db) Verbrauch = (Stand - Stand_db) print(Verbrauch) instance.save()

+0

Вы должны написать описатель проблемы. Каким образом это «не работает»? Что происходит? есть ли журналы ошибок? – TomDunning

+0

У меня нет ошибки. Я отправляю форму и ничего не происходит. Я думаю, что это имеет какое-то отношение к этой части: кода Stand_db = Daten.objects.lastest (Verbraucher) instance.Verbrauch = do_calc (Stand-Stand_db) Кажется, что расчет не выполняется. – MFIC

+0

Я думаю, что у вас может возникнуть проблема в том, что вы используете «lastest» вместо «latest» – madprops

ответ

0

Спасибо всем большое за поддержку и идеи! мне удалось получить решение моей проблемы:

if form.is_valid(): 
      instance = form.save(commit=False) 
      Verbraucher_form = form.cleaned_data['Verbraucher'] 
      Stand_form = form.cleaned_data['Stand'] 
      Stand_db = Daten.objects.filter(Verbraucher=Verbraucher_form).values('Stand').order_by('-Stand')[0] 
      Stand_db2 = decimal.Decimal(Stand_db['Stand']) 
      instance.Verbrauch = (Stand_form - Stand_db2) 
      instance.save() 

Stand_db дает последнее значение в десятичной системе счисления выбранного счетчика в словаре. Чтобы получить фактическое значение, мне пришлось отделить ключ от имени. Stand_db2 делает это.

Наконец, я делаю расчет и сохраняю запись.

+0

благодаря вам, прощаю мне -5 до моей репутации после ответа на ваш вопрос. думаю, я должен удалить его тогда. – Transformer

0

первую очередь способ устроить ваш взгляд не в порядке, хотя он будет работать. Данные подтвержденной формы будут в словаре form.cleaned_data. Эти данные были бы прекрасно преобразованы в типы Python для вас. Такие поля, как IntegerField, DecimalField и FloatField, преобразуют значения в Python int, Decimal и float соответственно.

from yourapp.model import Daten 

def dateneingabe(request): 
    if request.method == "POST": 
     form = DatenForm(request.POST) 
     if form.is_valid(): 
      instance = form.save(commit=False) 
      Stand_db = Daten.objects.lastest(Verbraucher) 
      #you used Stand instead of instance.stand and since instance.stand is decimalfield is will be processed nicely 
      instance.Verbrauch = do_calc(instance.Stand - float(Stand_db)) 
      instance.save() 
      return HttpResponseRedirect('/') 
    else: 
     form = DatenForm() 
    return render(request, 'verbrauch/eingabe.html', {'form': form}) 

Я надеюсь, что это помогает вне

+1

Благодарим вас за консультацию (мнение) и вашу идею. Это помогло мне решить мое решение. – MFIC

+0

рад, что я мог бы помочь. так как это помогло вам, согласиться с ответом @MFIC – Transformer