0

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.

Community
  • 1
  • 1
Craig Champion
  • 442
  • 9
  • 16
  • 1
    https://docs.djangoproject.com/en/1.9/topics/serialization/ – Shang Wang Jun 08 '16 at 13:38
  • Possible duplicate of [Convert Django Model object to dict with all of the fields intact](http://stackoverflow.com/questions/21925671/convert-django-model-object-to-dict-with-all-of-the-fields-intact) – e4c5 Jun 08 '16 at 13:49

0 Answers0