Поле внешнего ключа не регистрируется в базе данных

#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 объект.