Ошибка Django с ORM

#python #django #django-models

#python #django #django-модели

Вопрос:

Я начал изучать django и у меня возникла проблема с запросом ВСТАВКИ с использованием ORM (DB mysql). Моя модель:

 class Record(models.Model):
    id         = models.AutoField(primary_key=True, blank=True),
    schema_id  = models.IntegerField(),
    name       = models.CharField(max_length=50),
    desc       = models.TextField(blank=True)

    class Meta:
        db_table = 'keeper_record'
  

Следующий код обрабатывает запрос post в view.py:

 def add_record(request):
    if request.method == 'POST':
        Record.objects.create(
            schema_id  = request.POST.get('schema_id', 1),
            name       = request.POST.get('name', 'd'),
            desc       = request.POST.get('desc', ' ')
        )

        record.save()

    return HttpResponse('')
  

Но этот код вызывает ошибку:

 Request Method: POST
Request URL:    http://127.0.0.1:8000/records/add/
Django Version: 1.3.1
Exception Type: TypeError
Exception Value:    
'schema_id' is an invalid keyword argument for this function
Exception Location: C:Program Files (x86)Pythonlibsite-packagesdjangodbmodelsbase.py in __init__, line 364
Python Executable:  C:Program Files (x86)Pythonpython.exe
Python Version: 2.7.2
Python Path:    
['D:\Projects\passkeeper',
 'D:\xcfxf0xeexe3xf0xe0xecxecxfb\xcfxf0xeexe3xf0xe0xecxecxe8xf0xeexe2xe0xedxe8xe5\PyCharm\helpers',
 'D:\Projects\passkeeper',
 'D:\Projects',
 'C:\Windows\system32\python27.zip',
 'C:\Program Files (x86)\Python\DLLs',
 'C:\Program Files (x86)\Python\lib',
 'C:\Program Files (x86)\Python\lib\plat-win',
 'C:\Program Files (x86)\Python\lib\lib-tk',
 'C:\Program Files (x86)\Python',
 'C:\Program Files (x86)\Python\lib\site-packages']
  

Я устанавливаю драйвер mysql для python и имею стандартные настройки для проекта, но был удален только csrf

 MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
  

Ответ №1:

Я предполагаю, что эти запятые в определении вашей модели.

Вы устанавливаете schema_id кортеж поля модели. id = (models.AutoField(...),)

Удалите конечную запятую, и все должно быть готово.

 class Record(models.Model):
    id         = models.AutoField(primary_key=True, blank=True), # remove ,
    schema_id  = models.IntegerField(), # remove ,
    name       = models.CharField(max_length=50), # remove ,
    desc       = models.TextField(blank=True)

    class Meta:
        db_table = 'keeper_record'
  

Комментарии:

1. Спасибо, это действительно ошибка новичка 🙂

Ответ №2:

Конечные запятые в определении класса вашей модели создают проблемы, их удаление должно решить вашу проблему.

Завершающая запятая (,) создает кортеж с одним элементом.

 a = 1,
  

эквивалентно

 a = (1, )
  

Который представляет собой кортеж из одного элемента. В вашем случае происходит то, что ваши поля не распознаются Django как поля модели, поскольку ваши поля «завернуты» в кортеж.

Дополнительную информацию см. в документации Python по кортежам: http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences