Перебор множества полей Django

#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()