Tell me more ×
Code Review Stack Exchange is a question and answer site for peer programmer code reviews. It's 100% free, no registration required.

I'm trying to improve my code. I've some doubts about db_index, primary_key and unique parameters.

    # -*- coding: UTF-8 -*-

    from django.db import models
    from django.contrib.auth.models import User

    #=================================================================================#

    class Country(models.Model):
        country_id = models.IntegerField(primary_key=True, unique=True, verbose_name="Id", editable=False)
        name = models.CharField(unique=True, db_index=True, max_length=50, verbose_name="Nome")
        short_name = models.CharField(unique=True, max_length=5, verbose_name="Abreviatura")

        class Meta:
            verbose_name = "País"
            verbose_name_plural = "Países"
            ordering = ['name']

        def __unicode__(self):
            return self.name

    #=================================================================================#   

    class State(models.Model):
        state_id = models.IntegerField(primary_key=True, unique=True, verbose_name="Id", editable=False)
        state = models.CharField(unique=True, db_index=True, max_length=2, verbose_name="Sigla")
        name = models.CharField(unique=True, db_index=True, max_length=20, verbose_name="Nome")
        region = models.CharField(max_length=20, verbose_name="Região")
        country = models.ForeignKey(Country, verbose_name="País")

        class Meta:
            verbose_name = "Estado"
            verbose_name_plural = "Estados"
            ordering = ['name']

        def __unicode__(self):
            return self.name

    #=================================================================================#

    class City(models.Model):
        city_id = models.IntegerField(primary_key=True, unique=True, editable=False) # id baseado no IBGE
        name = models.CharField(db_index=True, max_length=150, verbose_name="Nome") # db_index para otimizar desempenho
        short_name = models.CharField(max_length=150, blank=True, null=True, verbose_name="Slug")    
        state = models.ForeignKey(State, verbose_name="Estado")

        class Meta:
            verbose_name = "Cidade"
            verbose_name_plural = "Cidades"
            ordering = ['name']

        def __unicode__(self):
            return ('%s - %s') % (self.name, self.state.state)

    #=================================================================================#

    class Phone(models.Model): 
        PHONES_TYPE_CHOICES = (
            ('R', u'Residencial'),
            ('M', u'Celular'),
            ('C', u'Comercial'),
        )

        user = models.ForeignKey(User, verbose_name='Usuário')
        type = models.CharField(max_length=1, choices=PHONES_TYPE_CHOICES, verbose_name='Tipo')
        number = models.CharField('Número', max_length=15)

        class Meta:
            verbose_name = "Telefone"
            verbose_name_plural = "Telefones"

        def __unicode__(self):
            return self.number

    #=================================================================================#

    class Address(models.Model):
        STREETS_TYPE_CHOICES = (
            ('R', 'Rua'),
            ('A', 'Avenida'),
            ('T', 'Travessa'),
            ('E', 'Estrada'),
            ('R', 'Rodovia'),
            ('Q', 'Quadra'),
            ('B', 'Bloco'),
        )

        user = models.ForeignKey(User, verbose_name='Usuário')
        street_type = models.CharField(max_length=1, choices=STREETS_TYPE_CHOICES, verbose_name='Logradouro')
        street = models.CharField('Endereço', max_length=100)
        number = models.IntegerField(verbose_name='Número')
        complement = models.CharField(max_length=45, blank=True, verbose_name='Complemento')
        neighborhood = models.CharField('Bairro', max_length=100)
        state = models.ForeignKey(State, verbose_name="Estado")
        city = models.ForeignKey(City, verbose_name="Cidade")
        country = models.ForeignKey(Country, verbose_name="País")
        zip_code = models.CharField('CEP', max_length=10)

        class Meta:
            verbose_name = "Endereço"
            verbose_name_plural = "Endereços"

        def __unicode__(self):
            return ("%s, %s") % (self.city, self.state)

    #=================================================================================#
share|improve this question

2 Answers

up vote 1 down vote accepted

Is it introspected DB or newly created models? If it is created, you do not need SOMETHING_id fields, Django creates primary keys automatically.

Always use unicode strings (u'something') for everything that is displayed to user and can contain non-ascii characters.

You don't need parenthesis around string in __unicode__

And the best way to set indexes is to analyze real queries that are being ran on specific model. Every new index slows down INSERT and UPDATE queries so do not use indexes if you don't need them. Also, in most cases indexes for chars work good only in exact or startswith comparisons (in Django terms). If you are using contains - index is useless.

share|improve this answer
Thank you! It's a introspected DB (this is the reason to use the custom ID). Any other tips? – B. Porto May 8 '12 at 0:55

If primary_key=True set to field then unique=True is redundant. unique=True also assumes that db_index=True

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.