#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
есть atitle
или aname
, потому что вы используете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.