Как разрешить объект 'кортеж' не имеет атрибута '_committed' ошибка - PullRequest
0 голосов
/ 04 февраля 2020

Я сравнительно новичок в разработке 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 фреймворк.

1 Ответ

1 голос
/ 04 февраля 2020

В вашем коде:

     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

у вас есть запятые после каждой строки (кроме первой и последней); возможно, привычка из другого языка, такого как SQL (или вы думали в скобках, рассматривая их как, например, аргументы значения ключа). Эти запятые делают кортежи значений. Удалите запятые.

Чтобы уточнить: кортеж определяется не столько скобками, которые окружают значения, сколько запятой (конечная):

tuple1 = 1, 2
tuple2 = (1,)
tuple3 = 1,
integer = (1)
empty = ()   # empty tuple
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...