Поле внешнего ключа не регистрируется в базе данных
Я добавляю новый внешний ключ в свою модель, но он выдает ошибку, когда я мигрирую.
Поле 'id' ожидало число, но получило 'XD'.
МОДЕЛЬ:
item_tool= models.ForeignKey(Tools,default='XD', on_delete=SET_DEFAULT)
КЛАСС:
class Tools(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = 'Tools'
def __str__(self):
return self.name
КАТЕГОРИИ
class Categories(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
МОДЕЛЬ:
item_category = models.ForeignKey(Categories, default='Coding', on_delete=SET_DEFAULT)
Вы не можете установить default='XD'
, так как ForeignKey
ожидает или объект Tools
, или первичный ключ модели для ссылки.
Однако вы можете передать ссылку на вызываемый объект, который получит или создаст объект Tools
с именем 'XD'
:
def xd_tool():
return Tools.objects.get_or_create(name='XD')
class MyModel(models.Model):
item_tool = models.ForeignKey(Tools, default=xd_tool, on_delete=SET_DEFAULT)
Мы можем повысить эффективность, кэшируя XD
инструмент в функции, это можно сделать только в том случае, если инструменты неменяются в какой-то момент времени:
def xd_tool():
cache = getattr(xd_tool, 'cache', None)
if cache is not None:
return cache
xd_tool.cache = cache = Tools.objects.get_or_create(name='XD')
return cache
Я бы также посоветовал сделать имена ваших Tools
моделей уникальными, иначе может быть два инструмента с одинаковыми именами, что внесет много путаницы:
class Tools(models.Model):
name = models.CharField(max_length=200, unique=True)
class Meta:
verbose_name_plural = 'Tools'
def __str__(self):
return self.name
Примечание: обычно модели Django присваивается сингулярное имя, поэтому
Tool
вместо.Tools