I wish to convert a model with nullable foreign keys to a dictionary. This is the model code:
class Guideline(SortableModel):
    title = models.CharField(max_length=255)
    content = models.TextField()
    type = models.CharField(choices=DOCUMENT_TYPE, max_length=255)
    added = models.DateTimeField(default=datetime.now)
    updated = models.DateTimeField(default=datetime.now)
    reference = models.CharField(max_length=150)
    visible = models.BooleanField(default=True)
    accredited = models.BooleanField(default=False)
    appMgp = models.BooleanField(
        default=False,
        verbose_name = "xxx App",
    )
    appNurses = models.BooleanField(
        default=False,
        verbose_name = "xxx App",
    )
    category = SortableForeignKey(Category)
    categoryalt1 = models.ForeignKey(Category, related_name='categoryalt1', verbose_name = "Alt Category 1", null=True, blank=True)
    categoryalt2 = models.ForeignKey(Category, related_name='categoryalt2', verbose_name = "Alt Category 2", null=True, blank=True)
    categoryalt3 = models.ForeignKey(Category, related_name='categoryalt3', verbose_name = "Alt Category 3", null=True, blank=True)
    source = models.ForeignKey(Source)
    custom1 = models.CharField(
        max_length=255,
        verbose_name = "xxx",
        blank=True
    )
    custom2 = models.CharField(
        max_length=255,
        verbose_name = "Custom 2 (unused)",
        blank=True
    )
    custom3 = models.CharField(
        max_length=255,
        verbose_name = "Custom 3 (unused)",
        blank=True
    )
    class Meta(SortableModel.Meta):
        get_latest_by = 'updated'
    def render(self, template=None, request=None):
        if template is None:
            template = 'xxx.html'
        if request:
            context = RequestContext(request)
        else:
            context = None
        return render_to_string(template, {'guideline': self}, context)
    def as_dict(self):
        rendered = self.render()
        return {
            'id': self.id,
            'title': self.title,
            'content': rendered,
            'type': self.type,
            'source': self.source.title,
            'category': {
                'id': self.category.id,
                'name': self.category.name,
                'shortname': self.category.shortname,
                'order': self.category.order,
                'appMgp' : self.category.appMgp,
                'appNurses' : self.category.appNurses,
            },
            'categoryalt1': {
                'id': self.categoryalt1.id,
                'name': self.categoryalt1.name,
                'shortname': self.categoryalt1.shortname,
                'order': self.categoryalt1.order,
                'appMgp' : self.categoryalt1.appMgp,
                'appNurses' : self.categoryalt1.appNurses,
            },
            'categoryalt2': {
                'id': self.categoryalt2.id,
                'name': self.categoryalt2.name,
                'shortname': self.categoryalt2.shortname,
                'order': self.categoryalt2.order,
                'appMgp' : self.categoryalt2.appMgp,
                'appNurses' : self.categoryalt2.appNurses,
            },
            'categoryalt3': {
                'id': self.categoryalt3.id,
                'name': self.categoryalt3.name,
                'shortname': self.categoryalt3.shortname,
                'order': self.categoryalt3.order,
                'appMgp' : self.categoryalt3.appMgp,
                'appNurses' : self.categoryalt3.appNurses,
            },
            'order': self.order,
            'visible': self.visible,
            'accredited': self.accredited,
            'colour': self.source.colour,
            'file': self.reference,
            'custom1': self.custom1,
            'custom2': self.custom2,
            'custom3': self.custom3,
            'appMgp' : self.appMgp,
            'appNurses' : self.appNurses,
        }
    def get_absolute_url(self):
        return "/api/guideline/%s/" % self.id
    def __unicode__(self):
        return self.title
    def save(self, *args, **kwargs):
        self.updated = datetime.now()
        if not self.reference:
            self.reference = "%s-%s.html" % (self.category.id, self.id)
        super(Guideline, self).save(*args, **kwargs)
categoryalt1, categoryalt3 or categoryalt3 are potentially null / empty child objects. However, if any of these are null I get the error:
'NoneType' object has no attribute 'id'
when calling the as_dic()
How do I structure the as_dic() to allow for nullable / blank child objects?
I have looked at: Convert Django Model object to dict with all of the fields intact . However, it is not clear to me from this post how to handle nullable child objects.
 
    