我正在尝试创建一个具有多个外键的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'}
收到错误:
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'
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)
答案 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)