Skip to content

Instantly share code, notes, and snippets.

@gnrfan
Created September 10, 2012 16:12
Show Gist options
  • Save gnrfan/3691808 to your computer and use it in GitHub Desktop.
Save gnrfan/3691808 to your computer and use it in GitHub Desktop.
An example of chained foreign keys using django-smart-selects from PyPi.
from django.conf import settings
from django.contrib.gis.db import models
from smart_selects.db_fields import ChainedForeignKey
from common.models import AuditableModel
from ubigeos import strings
class Department(models.Model):
"""
A peruvian department.
"""
name = models.CharField(
verbose_name=strings.DEPARTMENT_NAME,
max_length=128,
)
def __unicode__(self):
return self.name
class Meta:
verbose_name = strings.DEPARTMENT_VERBOSE_NAME
verbose_name_plural = strings.DEPARTMENT_VERBOSE_NAME_PLURAL
@staticmethod
def get_or_create_from_name(name):
try:
return Department.objects.get(name=name)
except Department.DoesNotExist:
obj = Department(name=name)
obj.save()
return obj
class Province(models.Model):
"""
A peruvian province.
"""
name = models.CharField(
verbose_name=strings.PROVINCE_NAME,
max_length=128,
)
department = models.ForeignKey(Department,
verbose_name=strings.PROVINCE_DEPARTMENT
)
def __unicode__(self):
return self.name
class Meta:
verbose_name = strings.PROVINCE_VERBOSE_NAME
verbose_name_plural = strings.PROVINCE_VERBOSE_NAME_PLURAL
@staticmethod
def get_or_create_from_csv_record(record, delimiter=','):
parts = record.split(delimiter)
department_name = parts[0].strip()
province_name = parts[1].strip()
# Get or create deparment
department = Department.get_or_create_from_name(department_name)
# Get or create province
try:
return Province.objects.get(
name=province_name,
department=department
)
except Province.DoesNotExist:
obj = Province(name=province_name, department=department)
obj.save()
return obj
class District(models.Model):
"""
A peruvian district.
"""
name = models.CharField(
verbose_name=strings.DISTRICT_NAME,
max_length=128,
)
province = models.ForeignKey(Province,
verbose_name=strings.DISTRICT_PROVINCE
)
def __unicode__(self):
return self.name
class Meta:
verbose_name = strings.DISTRICT_VERBOSE_NAME
verbose_name_plural = strings.DISTRICT_VERBOSE_NAME_PLURAL
@staticmethod
def get_or_create_from_csv_record(record, delimiter=','):
parts = record.split(delimiter)
department_name = parts[0]
province_name = parts[1]
district_name = parts[2]
# Get or create province
province = Province.get_or_create_from_csv_record(
record=("%s%s%s" % (department_name, delimiter, province_name,)),
delimiter=delimiter
)
# Get or create district
try:
return District.objects.get(
name=district_name,
province=province
)
except District.DoesNotExist:
obj = District(
name=district_name,
province=province
)
obj.save()
return obj
class Ubigeo(models.Model):
"""
A peruvian ubigeo code.
"""
code = models.CharField(
verbose_name=strings.UBIGEO_CODE,
max_length=6,
unique=True
)
department = models.ForeignKey(Department,
verbose_name=strings.UBIGEO_DEPARTMENT,
blank=True,
null=True
)
province = ChainedForeignKey(Province,
verbose_name=strings.UBIGEO_PROVINCE,
chained_field="department",
chained_model_field="department",
show_all=False,
auto_choose=True,
blank=True,
null=True
)
district = ChainedForeignKey(District,
verbose_name=strings.UBIGEO_DISTRICT,
chained_field="province",
chained_model_field="province",
show_all=False,
auto_choose=True,
blank=True,
null=True
)
def __unicode__(self):
return self.code
class Meta:
verbose_name = strings.UBIGEO_VERBOSE_NAME
verbose_name_plural = strings.UBIGEO_VERBOSE_NAME_PLURAL
@bhagatprince011
Copy link

hello dear Sir,
i want your help regarding all the things that has to be done for using ChainedForeignKey
i've been trying for so many days..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment