Django публикует первичный ключ как slug? Как мне ссылаться на первичный ключ в models.py ?

#django

#django

Вопрос:

При создании slug для моей модели post я хочу использовать первичный ключ объекта в качестве slug. Однако, когда я создаю новое сообщение, instance.id оно не является типом, а не целым числом, как я себе представляю.

Вот моя модель:

 class Post(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50, null=False, blank=False)
    body = models.TextField(max_length=5000, null=False, blank=False)
    image = models.ImageField(upload_to=upload_location, null=False, blank=False)
    date_published = models.DateTimeField(auto_now_add=True, verbose_name="date published")
    date_updated = models.DateTimeField(auto_now=True, verbose_name="date updated")
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    slug = models.SlugField(blank=True, unique=True)

    def __str__(self):
        return self.title
    
@receiver(post_delete, sender=Post)
def submission_delete(sender, instance, **kwargs):
    instance.image.delete(False)

def pre_save_blog_post_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = slugify(instance.id)

pre_save.connect(pre_save_blog_post_receiver, sender=Post)
 

Как вы можете видеть в pre_save_blog_post_receiver , instance.id возвращает значение None. Как мне правильно ссылаться на первичный ключ в этой ситуации?

Комментарии:

1. Вам нужно использовать post_save в случае, если вы создаете Post объект, поскольку до его фиксации в базе данных нет первичного ключа. База данных «распределяет» первичные ключи.

2. однако замедление первичного ключа является довольно «странным». В этом случае вы можете использовать id себя вместо slug.

Ответ №1:

Вам нужно использовать post_save в случае, если вы создаете Post объект, поскольку до его фиксации в базе данных нет первичного ключа. База данных «распределяет» первичные ключи.

Слияние с помощью an id , однако, немного «странно«. Идея slug состоит в том, чтобы сделать визуально приятный вариант заголовка или какого-либо другого атрибута, связанного с текстом.

Также может быть удобнее использовать AutoSlugField [readthedocs.io ] из django-autoslug [readthedocs.io ] посылка:

 from autoslug import AutoSlugField

class Post(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50)
    body = models.TextField(max_length=5000)
    image = models.ImageField(upload_to=upload_location)
    date_published = models.DateTimeField(auto_now_add=True, verbose_name='date published')
    date_updated = models.DateTimeField(auto_now=True, verbose_name='date updated')
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    slug = models.SlugField(populate_from='title')

    def __str__(self):
        return self.title