Невозможно создать поле модели автоматически ошибка в строке запроса
У меня есть:
class ZipCode(models.Field):
def __init__(self, *args, **kwargs):
kwargs['verbose_name'] = "Cep"
super().__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
del kwargs["verbose_name"]
return name, path, args, kwargs
def db_type(self, connection):
return 'char(8)'
class Address(models.Model) :
zip = ZipCode()
он работает нормально и делает вербозу правильно в поле
Теперь я хотел бы реализовать автоматические параметры для lenght и verbose_name
Мне понравилось следующее:
class ZipCode(models.Field):
def __init__(self, length=None, verbose=None, *args, **kwargs):
self.length = length
self.verbose = verbose
kwargs['verbose_name'] = self.verbose
super().__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
return name, path, args, kwargs
def db_type(self, connection):
print (F"char({self.length})")
return F"char({self.length})"
class Address(models.Model) :
zip = ZipCode(16, 'cep')
....
Выражение
print (F "char({self.length})"))
возвращает
char(16).
как и ожидалось
Но он передает ошибку на запрос mysql
**return self.cursor.execute(sql)
File "C:\Users\Carlos\AppData\Roaming\Python\Python310\site-packages\MySQLdb\cursors.py", line 319, in _query
db.query(q)
File "C:\Users\Carlos\AppData\Roaming\Python\Python310\site-packages\MySQLdb\connections.py", line 254, in query
_mysql.connection.query(self, query)
django.db.utils.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'None) NOT NULL, `address` varchar(200) NOT NULL, `number` varchar(10) NOT NULL, ' at line 1")
PS D:\Softwares\python\dj\hotplateprensas>
* Histórico restaurado**
Как я могу это исправить?
Хорошо,
Я так и сделал:
from tabnanny import verbose
from django.db import models
class FieldChar(models.Field):
def __init__(self, *args, **kwargs):
self.max_length = kwargs.get('max_length')
if kwargs.get('verbose_name'):
self.verbose_name = kwargs.get('verbose_name')
super().__init__(*args, **kwargs)
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
if kwargs.get('verbose_name'):
del kwargs['verbose_name']
return name, path, args, kwargs
def db_type(self, connection):
return f'char({self.max_length})'
и у меня все работает нормально
Требуется только длина char, имя verbose_name является факультативным