Краткий ответ : сделать модели не -абстрактными.
Я думаю, что вы на самом деле не понимаете концепцию абстрактных моделей,Абстрактная модель означает, что она на самом деле не существует: вы определяете столбцы, но для этой модели нет таблицы.Вы делаете это только так, что можете создать другую модель, которая наследует от абстрактных моделей, так что вы можете автоматически определять огромное количество столбцов, а также определенное общее поведение.Или, как указано в документации Django :
Абстрактные базовые классы полезны, когда вы хотите поместить некоторую общую информацию в ряд других моделей .Вы пишете свой базовый класс и помещаете abstract=True
в класс Meta
.Эта модель не будет использоваться для создания таблицы базы данных .Вместо этого, когда он используется в качестве базового класса для других моделей, его поля будут добавлены к полям дочернего класса.
Здесь, однако, вы определяете формы, сериализаторы и т. Д. Для этих абстрактных моделей.Это очень странно, поскольку как CategoriesForm
удалось бы создать Categories
объект, если вы - по замыслу - не сможете построить такие Categories
объекты: вы можете только построить не -абстрактные объекты модели (которые могут или не могут наследоваться от одной или нескольких абстрактных моделей).
Ваши модели определены как абстрактные:
class Categories(models.Model):
name = models.CharField(max_length=255)
class Meta:
<s><b>abstract = True</b></s>
ИтакВы должны пропустить это (и это, вероятно, применимо к большинству, если не ко всем моделям, которые вы определили).
Затем вам также придется создать таблицу в базе данных.Вы можете сделать это, выполнив миграцию:
python3 manage.py makemigrations
и затем перенастроить базу данных:
python3 manage.py migrate
Ошибка als появляется, если мы создаем абстрактную модель и создаем объект, например:
class Foo(models.Model):
bar = models.IntegerField()
class Meta:
abstract = True
Тогда, если мы создадим такой объект, мы получим ту же ошибку:
>>> Foo(bar=12)
Traceback (most recent call last):
File "/usr/lib/python3.6/code.py", line 91, in runcode
exec(code, self.locals)
File "<console>", line 1, in <module>
File "/tmp/foo/.local/lib/python3.6/site-packages/django/db/models/base.py", line 513, in __repr__
return '<%s: %s>' % (self.__class__.__name__, self)
File "/tmp/foo/.local/lib/python3.6/site-packages/django/db/models/base.py", line 516, in __str__
return '%s object (%s)' % (self.__class__.__name__, self.pk)
File "/tmp/foo/.local/lib/python3.6/site-packages/django/db/models/base.py", line 564, in _get_pk_val
return getattr(self, meta.pk.attname)
AttributeError: 'NoneType' object has no attribute 'attname'
Примечание : номенклатура не совсем следует правилам.Обычно название модели - единственное число , поэтому Category
вместо Categories
и CategoryForm
вместо CategoriesForm
или CategoryForms
.