#django #model #field
Вопрос:
Я добавляю новый внешний ключ в свою модель, но при переносе он выдает ошибку.
Поле «идентификатор» ожидало номер, но получило «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)
Комментарии:
1. Вы не можете установить
default='XD'
, такForeignKey
как ожидает илиTools
объект, или первичный ключ модели для ссылки.
Ответ №1:
Вы не можете установить 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
Комментарии:
1. Спасибо за ответ. Поскольку я новый пользователь и ранее в своей модели я создал простое поле категории, и оно отлично работает . на этот раз я пытаюсь повторить тот же процесс, но теперь получаю ошибку.
2. @Waqart: вы также должны определить функцию для категорий и использовать
default=that_function
ее для автоматической установки вCategories
объект.