Django Вычисляет Похожие Сообщения На Основе Категорий, Которые Не Работают

#django #categories #similarity

Вопрос:

Я хочу рассчитать похожие сообщения на основе категорий. Это то, что у меня есть до сих пор в моделях:

 class Post(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE, default=15)

    def get_related_posts_by_tags(self):
       category = get_object_or_404(Category, name=self.category.title)
       posts = Post.objects.filter(category=category)
       return posts

class Category(models.Model):
    name = models.CharField(max_length=250, unique=True)
 

И в моих шаблонах:

 {% for posts in object.get_related_post_by_tag %}
   {{ posts.title }}
{% endfor %}
 

По какой-то причине это не работает, и в моем шаблоне я не видел ни одного сообщения с той же категорией. Вот почему мне интересно, делаю ли я это неправильно, или у меня есть небольшая проблема, которую я легко решаю. Спасибо за всю помощь.

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

1. У вас Category есть a title или a name , потому что вы используете self.category.title , но у Category вас, похоже, есть только name поле.

2. @WillemVanOnsem подождите, я знаю проблему; в своих моделях он говорит «object.get_related_post_by_tags», а в своем шаблоне он говорит «object.get_related_post_by_tag»

3. @WillemVanOnsem в нем есть только поле имени.

4. @JohnD9oe: да, но все равно для этого потребуются дополнительные запросы, поэтому это не очень эффективно. Вы сделаете запрос self.category , а затем еще один, get_objects_or_404 чтобы снова получить ту же категорию.

Ответ №1:

Вы можете работать с:

должность в классе(модели.Модель):
 категория = модели.Внешний ключ(Категория, on_delete=модели.КАСКАД, по умолчанию=15)

 def get_related_posts_by_tags(самостоятельно):
 верните Post.objects.filter(идентификатор категории=self.идентификатор категории)

Это также предотвратит загрузку Category объекта в память, если он не будет использоваться в дальнейшем.

Возможно, вы захотите исключить текущую запись, в этом случае вы можете использовать:

должность в классе(модели.Модель):
 категория = модели.Внешний ключ(Категория, on_delete=модели.КАСКАД, по умолчанию=15)

 def get_related_posts_by_tags(самостоятельно):
 верните Post.objects.filter(
category_id=self.category_id
).исключить(pk=self.pk)

В вашем шаблоне также есть опечатка: это get_related_posts_by_tags , значит _posts_ , не _post_

 {% for posts in object.get_related_posts_by_tags %}
   {{ posts.title }}
{% endfor %} 

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

1. Привет, ваш ответ сработал, но .exclude(pk=self.pk) не сработал. На нем был тот же пост в месте рекомендации.

2. @Xandier: вы уверены, что не сделали return отфильтрованный набор запросов, а затем не .exclude(..) позвонили? Обычно, если .exclude(..) вызов находится в цепочке QuerySet вызовов метода, он исключает текущую запись.

3. нет, я вернул отфильтрованный набор запросов .exclude(pk=self.pk) . Я сделал это: return Post.objects.filter(category_id=self.category_id).exclude(pk=self.pk)

4. @Xandier: не могли бы вы print(self.pk) перейти на обратную линию. Вы уверены, что не сделали два поста с одинаковым названием и т. Д.

5. @Виллием Ван Онсем, Нет, я уверен, что у них разные названия, и когда вы печатаете(self.pk) Я получаю 74 за один пост. Когда я пробую другой пост, он равен 1.