#python #django #django-commands
Вопрос:
Удаление сообщений с помощью команды Django не работает. Я не знаю, что делать, я в тупике. Я надеюсь, что вы сможете мне помочь…
delnc.py Команда «Файл»
class Command(BaseCommand):
help = 'Командa для удаления всех постов из категории'
requires_migrations_checks = True
missing_args_message = 'Недостаточно аргументов'
def add_arguments(self, parser):
parser.add_argument('category_name', type=str)
def handle(self, *args, **options):
print('Мастер код: 7548')
answer = input('Введите Мастер код для удаления: ')
if answer == '7548':
try:
category = str(options['category_name'])
Post.objects.filter(postCategory__category_name=category).delete()
Post.save()
self.stdout.write(self.style.SUCCESS(f'Успешно. Все новости категории {category} удалены!'))
except Post.DoesNotExist:
self.stdout.write(self.style.ERROR('Нет такой категории! Отказано!'))
else:
self.stdout.write(self.style.ERROR('В доступе отказано!'))
models.py
class Category(models.Model):
category_name = models.CharField(max_length=64, unique=True)
subscribers = models.ManyToManyField(User, blank=True, null=True)
class Meta:
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
def __str__(self):
return self.category_name
class Post(models.Model):
PostAuthor = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='Автор поста')
PostNews = 'PN'
PostArticle = 'PA'
# «статья» или «новость»
POSITIONS = [
(PostArticle, 'Статья'),
(PostNews, 'Новость'),
]
postCategory = models.ManyToManyField(Category, verbose_name='Категория поста', through='PostCategory')
title = models.CharField(max_length=50, verbose_name='Название')
positions = models.CharField(max_length=2, choices=POSITIONS, default=PostArticle, verbose_name='Тип поста')
category_id = models.ForeignKey(Category, verbose_name='Категория', null=True, on_delete=models.CASCADE, related_name='category_id')
data = models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')
data_update = models.DateTimeField(auto_now=True, verbose_name='Дата редактирования')
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото', blank=True, default='/photos/def/1.jpg/')
previewName = models.CharField(max_length=128, verbose_name='Превью поста')
text = models.TextField(verbose_name='Текст поста')
rating = models.SmallIntegerField(default=0, verbose_name='Рейтинг')
public = models.BooleanField(default=True, verbose_name='Опубликовано')
def like(self):
self.rating =1
self.save()
def dislike(self):
self.rating -=1
self.save()
def preview(self):
return self.text[0:124] '...'
def __str__(self):
return self.title
class Meta:
verbose_name = 'Пост'
verbose_name_plural = 'Посты'
def get_absolute_url(self):
return f'/news/{self.pk}'
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
cache.delete(f"new-{self.pk}")
Вот вывод с консоли
Но он ничего не удаляет, хотя и пишет, что все было успешно завершено
Комментарии:
1. вызов to
Post.save()
ничего не делает, потому что он вызывается для класса модели, а не для экземпляра. Я не думаю, что тебе нужен этот звонок, потому.delete()
что работа уже сделана.2. Вы можете проверить отфильтрованные объекты , выполнив несколько шагов вместо одного шага:
posts = Post.objects.filter(postCategory__category_name=category)
, затемprint(posts)
и, наконецposts.delete()
; это покажет вам, были ли найдены какие-либо объекты