Использование related_name в Django

Я запутался в использовании related_name в моделях django, я знаю, что идея в том, чтобы дать мне доступ ко всем полям другой таблицы с помощью foreignkey, я просто не уверен, как это использовать.

Мой model.py:

class Component(MPTTModel):
    name = models.CharField(max_length=100)
    manufacturer = models.CharField(max_length=100)
    model = models.CharField(max_length=100)
    serial_number = models.CharField(max_length=255)
    price = models.IntegerField()
    note = models.TextField()
    image = models.ImageField(blank=True, null=True,
                              upload_to='components_imgs')
    parent = TreeForeignKey("self", verbose_name=(
        "Parent Component"), blank=True, null=True, related_name='children', on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.id}, {self.name}"

class Job(models.Model):
    job_type = (
        ('I', 'Interval'),
        ('O', 'One time'),
    )
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=100)
    type = models.CharField(max_length=1, choices=job_type)
    interval = models.IntegerField()
    is_critical = models.BooleanField()
    due_date = models.DateField()
    component = models.ForeignKey(
        Component, related_name='jobs', on_delete=models.CASCADE)
    runninghours = models.ForeignKey(
        RunningHours, related_name="RHjobs", on_delete=models.CASCADE)

    def __str__(self):
        return self.name

my view.py:

def worklist(request):
    components = Component.objects.all()
    Component_jobs = components.jobs.all()
    context = {"component":components,
    "Component_jobs":Component_jobs}
    return render(request,"worklist.html",context)

Я пытаюсь понять, почему эти строки дают мне ошибку 'TreeQuerySet' object has no attribute 'jobs'

components = Component.objects.all()
Component_jobs = components.jobs.all()

но эти строки работают просто отлично,

component = Component.objects.all()
component_id = Component.objects.get(id=pk)
job_id = component_id.jobs.all()

разве они не одинаковы, но в одном случае я получаю все задания для определенного ID, а в другом - все задания для всех компонентов?

Как описывает ошибка, этот код возвращает объект TreeQuerySet.

components = Component.objects.all()

Попытка вызвать поля типа price приведет к той же ошибке.

components = Component.objects.all()
Component_jobs = components.price.all()

Причина, по которой этот код работает, заключается в том, что он вызывается на конкретном компоненте, а не на коллекции компонентов.

component = Component.objects.all()
component_id = Component.objects.get(id=pk)
job_id = component_id.jobs.all()

Чтобы получить все задания в наборе запросов, попробуйте использовать что-то вроде .values('jobs') из queryset api reference

all_jobs = Component.objects.all().values('jobs')

Предположим, что вы хотите отобразить все компоненты в цикле, а затем отобразить все связанные задания для каждого компонента во вложенном цикле, ваш шаблон должен выглядеть примерно следующим упрощенным примером

{% for component in components %}
  {{ component }}
  {% for job in component.jobs.all %}
    {{ job }}
  {% endfor %}
{% endfor %}

Вы должны использовать prefetch_related для получения всех связанных заданий для всех компонентов в одном запросе. Нет необходимости запрашивать задания в представлении

components = Component.objects.all().prefetch_related('jobs')
Вернуться на верх