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

Я добавляю новый внешний ключ в свою модель, но он выдает ошибку, когда я мигрирую.

Поле '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.

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