Weather App Tutorial. Part 2 of 5. Models

This is the second part of my tutorial how to make a weather app. This time I will show you how to create the models and set up the admin.

Open the models.py file in the climate_change directory and enter the following:

# -*- coding: UTF-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.conf import settings

class Location(models.Model):
    name = models.CharField(_("name"), max_length=200)
    location_id = models.CharField(
        _("location ID"),
        help_text=_("Location IDs can be retrieved from URLs of weather "
            "at specific cities at Yahoo! Weather, e.g. GMXX0008 from "
    class Meta:
    def __unicode__(self):
        return self.name

class WeatherLog(models.Model):
    location = models.ForeignKey(Location, verbose_name=_("location"))
    timestamp = models.DateTimeField(_("timestamp"))
    temperature = models.IntegerField(_("temperature (C°)"))
    humidity = models.IntegerField(_("humidity (%)"))
    wind_speed = models.DecimalField(
         _("wind speed (km/h)"),
    visibility = models.DecimalField(
         _("visibility (km)"),
    class Meta:
        verbose_name=_("weather log")
        verbose_name_plural=_("weather logs")
        ordering = ("-timestamp",)
    def __unicode__(self):
        return "%s @ %s" % (

The models are created. Now let's create the database schema for them.

python manage.py syncdb

Also in this step when asked, I created a superuser called "demo" to be able to access django-contributed administration. Let's try it out. We'll need to add a file admin.py to climate_change with this content:

# -*- coding: utf-8 -*-
from django.db import models
from django.contrib import admin

Location = models.get_model("climate_change", "Location")
WeatherLog = models.get_model("climate_change", "WeatherLog")


Then uncomment admin related lines in urls.py of the project:

# -*- coding: utf-8 -*-
from django.conf.urls.defaults import *
from django.contrib import admin

urlpatterns = patterns("",
    (r"^admin/", include(admin.site.urls)),

Finally, run the development server and check if the models really work.

python shell runserver
# now you can go to in a browser

Yes! Everything works as expected for now. I will add my current location and its ID in Yahoo! Weather to the database. For me it's Berlin, Germany and the ID is GMXX0008. I found the ID in the URL of the page showing the weather for Berlin.

Tomorrow I will show you how to import weather details from Yahoo!


  1. Is there a reason why you use
    Location = models.get_model("climate_change", "Location")

    instead of importing the model with
    from climate_change.models import Location

    I never saw it this way.

  2. If you import the model like this, you are more flexible with the location of the app. Models might be under python path directly like appname.models or deeper under myproject.apps.appname.models or somepackage.appname.models. This way you can also use the trick about reusable models described in http://djangotricks.blogspot.com/2009/02/abstract-models-and-dynamicly-assigned.html