Я сравнительно новичок в разработке Django rest API. В настоящее время я работаю над сохранением Organisation class
и при обновлении этой модели я столкнулся с показанной ниже ошибкой:
Ошибка: у объекта 'tuple' нет атрибута '_committed '
Просто чтобы все знали: ошибка возникла только для вызова PUT
, а не для вызова POST
.
models.py
"""Database model for users in the system"""
org_id = models.AutoField(unique=True, primary_key=True)
org_code = models.CharField(max_length=19, blank=False)
org_name = models.CharField(max_length=100, blank=False, unique=True)
org_shortname = models.CharField(max_length=25, blank=False)
org_ml = models.ForeignKey(Translations, related_name='org_ml', on_delete=django.db.models.deletion.CASCADE,
null=True)
org_type = models.IntegerField()
org_logo = models.ImageField(null=True)
org_address = models.CharField(blank=True, max_length=250)
contact_name = models.CharField(blank=True, max_length=100)
contact_phone = models.CharField(blank=True, max_length=20)
country_code = models.CharField(blank=True, max_length=4)
contact_email = models.EmailField(blank=True, max_length=100)
creation_time = models.DateTimeField(auto_now_add=True, editable=False)
creation_by = models.ForeignKey("User", on_delete=django.db.models.deletion.CASCADE, null=True,
related_name="organisation_creation_by")
modification_time = models.DateTimeField(auto_now=True)
modification_by = models.ForeignKey("User", on_delete=django.db.models.deletion.CASCADE, null=True,
related_name="organisation_modification_by")
status = models.IntegerField(default=0)
def __str__(self):
return str(self.org_id) + " " + self.org_name
class Meta:
db_table = "organisation"
view.py
try:
req_data = request.body.decode('utf-8')
req_data = json.loads(req_data)
req_org_id = req_data['org_id']
req_org_name = req_data['org_name']
req_org_code = req_data['org_code']
req_org_shortname = req_data['org_shortname']
if "org_ml" in req_data:
req_org_ml = req_data['org_ml']
else:
req_org_ml = None
if "org_type" in req_data:
req_org_type = req_data['org_type']
else:
req_org_type = 0
req_org_logo = req_data['org_logo']
req_org_address = req_data['org_address']
req_contact_name = req_data['contact_name']
req_contact_phone = req_data['contact_phone']
req_country_code = req_data['country_code']
req_contact_email = req_data['contact_email']
if 'status' in req_data:
req_status = req_data['status']
else:
req_status = 0
if req_org_ml:
if req_org_ml['ml_id'] != 0:
trans = Translations.objects.filter(pk=req_org_ml['ml_id']).first()
if trans:
trans.ml_text = req_org_ml['ml_text']
trans.ml_group = req_org_ml['ml_group']
trans.status = req_org_ml['status']
if "details" in req_org_ml:
for item in req_org_ml['ml_details']:
if "sl_id" == 0:
details = Translation_details.objects.create(
ml_id=trans,
language=Language.objects.filter(pk=item['lang_id']),
sl_text=item['sl_text'],
sl_state=item['sl_state'],
status=item['status']
)
details.save()
else:
details = Translation_details.objects.filter(pk=item['sl_id']).first()
details.ml_id = trans,
details.language = Language.objects.filter(pk=item['language']),
details.sl_text = item['sl_text'],
details.sl_state = item['sl_state'],
details.status = item['status']
details.save()
else:
Response({"message": "Record not found"}, status=status.HTTP_400_BAD_REQUEST)
else:
trans = Translations.objects.create(
ml_text=req_org_ml['ml_text'],
ml_group=req_org_ml['ml_group'],
status=req_org_ml['status']
)
trans.save()
for item in req_org_ml['ml_details']:
details = Translation_details.objects.create(
ml=trans,
language=Language.objects.filter(pk=item['lang_id']).first(),
sl_text=item['sl_text'],
sl_state=item['sl_state'],
status=item['status']
)
details.save()
else:
trans = ''
org = Organisation.objects.get(pk=req_org_id)
org.org_name = req_org_name,
org.org_shortname = req_org_shortname,
if trans:
org.org_ml = trans,
org.org_code = req_org_code,
org.org_type = req_org_type,
org.org_logo = None,
org.org_address = req_org_address,
org.contact_name = req_contact_name,
org.contact_phone = req_contact_phone,
org.country_code = req_country_code,
org.contact_email = req_contact_email,
org.status = req_status
org.save()
return Response({"message": "Record updated successfully."}, status=status.HTTP_200_OK)
except Exception as e:
trace_back = traceback.format_exc()
logging.log.error(str(type(e)) + " " + str(trace_back))
return Response({"status": "exception", "message": "Internal Server Error"},
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Traceback:
Traceback (most recent call last):
File "D:\Workspace\Cormatix\backend\api\organisation\views.py", line 250, in put
org.save()
File "D:\Workspace\Cormatix\backend\venv\lib\site-packages\django\db\models\base.py", line 746, in save
force_update=force_update, update_fields=update_fields)
File "D:\Workspace\Cormatix\backend\venv\lib\site-packages\django\db\models\base.py", line 784, in save_base
force_update, using, update_fields,
File "D:\Workspace\Cormatix\backend\venv\lib\site-packages\django\db\models\base.py", line 862, in _save_table
for f in non_pks]
File "D:\Workspace\Cormatix\backend\venv\lib\site-packages\django\db\models\base.py", line 862, in <listcomp>
for f in non_pks]
File "D:\Workspace\Cormatix\backend\venv\lib\site-packages\django\db\models\fields\files.py", line 286, in pre_save
if file and not file._committed:
AttributeError: 'tuple' object has no attribute '_committed'
Также выше приведен пример кода, чтобы привыкнуть к Django фреймворк.