#python #django #django-models #django-templates
#python #django #django-модели #django-шаблоны
Вопрос:
У меня возникли некоторые проблемы с перебором поля ManyToMany. Я хочу иметь модель Post и тегов, и чтобы модель Post расширяла модель тегов в форме отношения ManyToMany.
Ниже приведены мои Tag
и Post
модели.
class Tag(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return f"{self.name}"
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=150)
content = RichTextField()
timestamp = models.DateTimeField(auto_now_add=True)
slug = models.SlugField(unique=True,default="",max_length=1000)
tag = models.ManyToManyField(Tag,related_name='tags',blank=True)
# .... other non related functions
Однако, когда я нахожусь в оболочке Django, я, похоже, не могу выполнить цикл по этим тегам, несмотря на то, что с объектом связаны теги.
Например, я бы сделал post1 = Post.objects.all()[0]
, а затем post1.tag.name.all()
, однако это выдало бы мне сообщение об ошибке "AttributeError: 'NoneType' object has no attribute 'all'
Все остальное, что я пробовал, потерпело неудачу. Что я могу исправить, чтобы решить проблему?
Заранее благодарю вас
Комментарии:
1. Удалите
.name
!2. Сделайте это ответом, и я отмечу его как правильный. Я не могу, я не подумал об этом lmao, спасибо еще раз!
Ответ №1:
Предполагается, что вы выполняете итерацию по объекту tags следующим образом
for tag in post1.tag.all():
print(tag.name)
Ответ №2:
Выполнить итерацию по множеству полей очень просто
for tag in post1.tag.all():
print(tag.name)
Помимо итерации, у меня есть несколько других предложений. Например
tag
будет иметь много тегов, поэтому его название tags
более подходящее. Во-вторых, related_name — это имя, которое используется для связи от связанного объекта обратно к этому, поэтому в вашем случае оно должно быть posts
вместо tags
Таким образом, это будет выглядеть следующим образом
tags = models.ManyToManyField(Tag, related_name='posts', blank=True)
Теперь вы можете получить доступ к записям из любого конкретного тега, используя это related_name . Например, если у вас есть тег
tag1 = Tag.objects.all()[0]
Теперь вы можете получить все записи с этим тегом, используя следующую строку
tag1_posts = tag1.posts.all()