如何允许外键在处理程序django-piston上设置为NULL

时间:2015-10-25 11:03:58

标签: django python-2.7 django-piston

我正在尝试创建一个具有多个外键的Dokumen类,其中几个可以设置为null。我尝试编写下面的代码,但是当它遇到API时,会发生以下错误。

class DokumenHandler(BaseHandler):
allowed_methods = ('GET','POST', 'PUT', 'DELETE',)

def read(self, request, dok_id=None):

    if dok_id:
        try:
            i = Dokumen.objects.get(pk=dok_id)            
            p = {
                'status': True,
                'data': {
                    'id': i.id,
                    'prinsip_id': i.prinsip.id,
                    'kriteria_id': i.kriteria.id,
                    'subkriteria_id': i.subkriteria.id,
                    'indikator_id': i.indikator.id,
                    'nama_dokumen': i.nama_dokumen
                },
                'message': 'success'
            }

            return p
        except ObjectDoesNotExist:
            return []
    else:
        dokumens = Dokumen.objects.all()

        data = []

        for i in dokumens:
            p = {
                'id': i.id,
                'prinsip_id': i.prinsip.id,
                'kriteria_id': i.kriteria.id,
                'subkriteria_id': i.subkriteria.id,
                'indikator_id': i.indikator.id,
                'nama_dokumen': i.nama_dokumen
            }

            data.append(p)

        return data

def create(self, request):
    if request.content_type:
        data = request.data
        nama_dokumen = request.FILES['nama_dokumen']

        try:
            d = Dokumen()
            d.prinsip_id = data['prinsip_id']
            d.kriteria_id = data['kriteria_id']
            d.subkriteria_id = data['subkriteria_id']
            d.indikator_id = data['indikator_id']
            d.nama_dokumen = nama_dokumen
            d.save()

        except Exception, e:
            resp = {'status': False, 'message': unicode(e)}
            return resp
        else:
            resp = {'status': True, 'message': 'success created dokumen'}
            return resp
    else:
        resp = {'status': False, 'message': 'failed created dokumen'}
        return resp

def update(self, request, dok_id=None):
    if request.content_type:
        data = request.data
        nama_dokumen = request.FILES['nama_dokumen']

        try:
            d = Dokumen.objects.get(pk=dok_id)
            d.prinsip_id = data['prinsip_id']
            d.kriteria_id = data['kriteria_id']
            d.subkriteria_id = data['subkriteria_id']
            d.indikator_id = data['indikator_id']
            d.nama_dokumen = nama_dokumen
            d.save()

        except Exception, e:
            resp = {'status': False, 'message': unicode(e)}
            return resp
        else:
            resp = {'status': True, 'message': 'success updated dokumen'}
            return resp
    else:
        resp = {'status': False, 'message': 'failed updated dokumen'}
        return resp

def delete(self, request, dok_id=None):
    if dok_id:

        try:
            d = Dokumen.objects.get(pk=dok_id)
            d.delete()

        except Exception, e:
            return {'status': False, 'message': unicode(e)}
        else:
            return { 'status': True, 'message': 'success deleted dokumen' }

    else:
        return {'status': False, 'message': 'failed deleted dokumen'}

收到错误:

  

Piston / 0.2.3rc1(Django 1.5.1)崩溃报告:Traceback(最近的   最后调用):文件“/home/notradamequeen/ISPO/ispo/api/handlers.py”,   第198行,读取'indikator_id':i.indikator.id,AttributeError:   'NoneType'对象没有属性'id'

Dokumen上课:

class Dokumen(models.Model):
    prinsip = models.ForeignKey(Prinsip)
    kriteria = models.ForeignKey(Kriteria)
    subkriteria = models.ForeignKey(Subkriteria, null=True, blank=True, default = 0)
    indikator = models.ForeignKey(Indikator, null=True, blank=True, default = 0)
    nama_dokumen = models.FileField(upload_to='dokumen')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s' % (self.nama_dokumen)

    def save(self, *args, **kwargs):
        if self.created_at == None:
            self.created_at = datetime.now()
        self.updated_at = datetime.now()
        super(Dokumen, self).save(*args, **kwargs)

2 个答案:

答案 0 :(得分:0)

def read(self, request, dok_id=None):

    if dok_id:
        try:
            i = Dokumen.objects.get(pk=dok_id)            
            p = {
                'status': True,
                'data': {
                    'id': i.id,
                    'prinsip_id': None,
                    'kriteria_id': None,
                    'subkriteria_id': None,
                    'indikator_id': None,
                    'nama_dokumen': i.nama_dokumen
                },
                'message': 'success'
            }
            if (i.prinsip) and (i.prinsip.id):
                p['data']['prinsip_id'] = i.prinsip.id
            if (i.kriteria) and (i.kriteria.id):
                p['data']['kriteria_id'] = i.kriteria.id
            if (i.subkriteria) and (i.subkriteria.id):
                p['data']['subkriteria_id'] = i.subkriteria.id
            if (i.indikator) and (i.indikator.id):
                p['data']['indikator_id'] = i.indikator.id

            return p
        except ObjectDoesNotExist:
            return []
    else:
        dokumens = Dokumen.objects.all()

        data = []

        for i in dokumens:
            p = {
                'id': i.id,
                'prinsip_id': None,
                'kriteria_id': None,
                'subkriteria_id': None,
                'indikator_id': None,
                'nama_dokumen': i.nama_dokumen
            }
            if (i.prinsip) and (i.prinsip.id):
                p['prinsip_id'] = i.prinsip.id
            if (i.kriteria) and (i.kriteria.id):
                p['kriteria_id'] = i.kriteria.id
            if (i.subkriteria) and (i.subkriteria.id):
                p['subkriteria_id'] = i.subkriteria.id
            if (i.indikator) and (i.indikator.id):
                p['indikator_id'] = i.indikator.id

            data.append(p)

        return data

答案 1 :(得分:0)

class Dokumen(models.Model):
prinsip = models.ForeignKey(Prinsip)
kriteria = models.ForeignKey(Kriteria)
subkriteria = models.ForeignKey(Subkriteria, null=True, blank=True, default = 0)
indikator = models.ForeignKey(Indikator, null=True, blank=True, default = 0)
nama_dokumen = models.FileField(upload_to='dokumen')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now_add=True)

def __unicode__(self):
    return '%s' % (self.nama_dokumen)

def save(self, *args, **kwargs):
    if self.created_at == None:
        self.created_at = datetime.now()
    self.updated_at = datetime.now()
    super(Dokumen, self).save(*args, **kwargs)