Gå til innhold

Django nybegynner: Hvordan få summert nummer fra en model og vise den i en annen list_display?


Anbefalte innlegg

Jeg har en model som "Oppdrag" og en som heter "Timer". Et oppdrag har mange timer da man på et oppdrag kan registrere timer og hvor mange timer man har brukt(sammen med beskrivelse osv).

 

Nå vil jeg at django skal summere opp alle "Timer.antall_timer" som hører til "Oppdrag" og vise de i list_display til "Oppdrag".

 

Hvordan kan jeg gjøre dette? Regner med at det er en ganske basic python funksjon kanskje, men jeg er veldig nybegynner på både python og django.

Lenke til kommentar
Videoannonse
Annonse

bruker du ForeignKey fra Timer() til Oppdrag() ?

 

isåfall kan du bruke aktivtOppdrag.timer_set.all for å få en liste over alle timer som tilhører oppdraget. man har også .count istedet for .all for å få en integer med nummer av timer.

 

I tillegg kan man ta Timer.objects.filter(oppdrag=aktivtoppdrag) for å få alle timer knyttet til et oppdrag.

 

Se for øvrig http://docs.djangoproject.com/en/dev/topic...y-relationships

Endret av Terrasque
Lenke til kommentar

Jeg vil nok ha det på oversikten over alle "timer"(i admin interfacet), slik at jeg kan filtrere ut et oppdrag over alle timene, så kun timene for det oppdraget blir listet opp. Jeg prøvde med list_filter = [oppdrag], men da det kom ikke opp noe ekstra filtrering i oversikten over timene. Ikke engang en feilmelding.

Lenke til kommentar

Jeg endte opp med å skrive en view, og har fått listet opp antall timer med en loop:

 

{% for time in oppdrag.timeliste_set.all %}
<li>{{ time.antall_timer }}</li>
{% endfor %}

 

Men tilbake til det med å summere opp, jeg så nevnte du oppdrag.timeliste_set.count. Men jeg må vel på en eller annen måte si hva han skal summere opp i timeliste-tabellen? Altså time.antall_timer.

 

Forresten, tusen takk for hjelpen så langt! Hadde nok ellers gitt opp for en stund siden.

Endret av Gakkakk
Lenke til kommentar

.count vil bare gi antall entries i QuerySet'et.

 

Se på http://docs.djangoproject.com/en/dev/ref/m.../querysets/#id8 (Men det er i django 1.1 vel å merke) - Spesielt Count der.

 

så.. Hvis jeg har forstått doc riktig, bør det bli

oppdrag.timeliste_set.antall_timer__count

sånn ca. Men det er i Django 1.1, som vel er på dev stadiet enda. Alternativet er å summere det i view funksjonen for siden.

 

c = 0
for time in timer:
  c = c + time.antall_timer

 

Send da c over til template'n, og bruk den der.

 

Edit: Ta en god titt på http://docs.djangoproject.com/en/dev/ forresten :) Er veldig lett å slå opp i når man blir vant med strukturen

Endret av Terrasque
Lenke til kommentar

Den koden for å summere timer, den må ligge i en funksjon ikke sant? Skal denne funksjonen ligge i View'en da?

 

Blir det riktig å tenke noe slikt?

def summerTimer():
	c = 0
	for time in timer:
		c = c + time.antall_timer

 

Og deretter sende c til templaten? Og blir hvor tar den egentlig timer fra? time-row'en i Oppdrag databasen?

Endret av Gakkakk
Lenke til kommentar

Jepp, det må ligge i en view (eller du kan lage templatetag.. men view er enklere).

 

timer henter du jo ut på en eller annen måte.. Eksempel kode for å hente timer for et oppdrag:

 

def timesummary(request, id)
oppdrag = Oppdrag.objects.get(id=id)
timer = Timer.objects.filter(oppdrag=oppdrag)
c = 0
	for time in timer:
		c = c + time.antall_timer
return render_to_response('template.html', { 'c':c, 'timer': timer, 'oppdrag':oppdrag})

 

'id' er da prosjekt id som hentes fra url via urls.py

 

Edit: Kom på en annen mulighet. Du kan overskrive save() for Timer modellen, og legge inn kode for å oppdatere et felt i Oppdrag modellen.

 

La meg se..

 

def save(self, force_insert=False, force_update=False):
if not self.id:  #Er det en ny instance som lagres?
	self.oppdrag.antall_timer = self.oppdrag.antall_timer + self.antall_timer
super(Timer, self).save(force_insert, force_update) # Fortsett med lagring

 

Er ikke sikker på at det vil virke (pga foreignkey), og den vil ikke oppdatere når et Timer objekt endres eller slettes. Du kan også overskrive delete() på modellen for å få oppdatert ved det.

 

Du kan også se på signals : http://www.mercurytide.co.uk/news/article/django-signals/ - men det har jeg ikke fått sett på selv, så kan ikke gi så mye hjelp der.

Endret av Terrasque
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...