Невозможно создать поле модели автоматически ошибка в строке запроса

У меня есть:

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 является факультативным

Вернуться на верх