Пользовательские ссылки в django

Вот мой первоначальный код

class Article(models.Model):
    article_author  = models.CharField(max_length=12)
    article_name    = models.CharField(max_length=60)
    article_body    = models.TextField()
    article_date    = models.DateTimeField(auto_now_add=True)
    article_tags    = models.CharField(max_length=25, choices=tags_, null=True)
    article_link    = make_link()  

Оказывается, она не будет добавлена в базу данных, и я не могу сделать миграцию (возможно, потому что она не является частью .models).  (Я хочу, чтобы ссылка создавалась автоматически при создании экземпляра класса article, без участия пользователя)

Я могу просто сделать его CharField и затем заменить все, что там было, функцией, но это кажется небрежным решением, также это даст бесполезное поле в стандартной админ-панели.

вы можете добавить свойство link к вашей модели как

class Article(models.Model):
    ...
    # article_link    = make_link()  

    @property
    def link(self):
        return make_link()

тогда вы сможете легко получить к нему доступ так же, как article.link

Я бы предложил генерировать ссылку на save() и хранить ее в CharField с editable=False, как предложил Виллем.

Документы: https://docs.djangoproject.com/en/4.0/ref/models/fields/#editable

class Article(models.Model):
    article_author  = models.CharField(max_length=12)
    article_name    = models.CharField(max_length=60)
    article_body    = models.TextField()
    article_date    = models.DateTimeField(auto_now_add=True)
    article_tags    = models.CharField(max_length=25, choices=tags_, null=True)
    article_link    = models.CharField(max_length=200, editable=False)

    def save(self):
        self.article_link = make_link()
        super().save()

Или, если ссылка на статью следует некоторой логике, может не быть необходимости генерировать и хранить ссылку, а обращаться к ней на лету как к свойству.

В Django для генерации URL для объекта модели используется метод get_absolute_url(), а не свойство: https://docs.djangoproject.com/en/4.0/ref/models/instances/#get-absolute-url

class Article(models.Model):
    article_author  = models.CharField(max_length=12)
    article_name    = models.CharField(max_length=60)
    article_body    = models.TextField()
    article_date    = models.DateTimeField(auto_now_add=True)
    article_tags    = models.CharField(max_length=25, choices=tags_, null=True)

    @property
    def article_link(self):
        return make_link()
Вернуться на верх