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.