Django не может понять, как использовать внешний ключ

'''

class Project_types(models.Model):
    project_type = models.CharField(max_length=200)

    def __str__(self):
        return self.project_type

class Projects(models.Model):
    project_types = models.ForeignKey(Project_types, on_delete=models.CASCADE)
    project = models.CharField(max_length=200)

    def __str__(self):
        return self.project

'''

Когда я пытаюсь выполнить - Project_types(project_type='games').item_set.all() я получаю ошибку, говорящую, что не существует набора элементов атрибутов.

Project_types(project_type='games') на самом деле не возвращает никакого объекта. Вот почему вы получили ошибку атрибута. Вам нужно добавить фильтр или использовать get. Что-то вроде следующего:

Project_types.objects.get(project_type='games').item_set.all()

Or

Project_types.objects.filter(project_type='games').item_set.all()
class Project_types(models.Model):
    project_type = models.CharField(max_length=200)

    def __str__(self):
        return self.project_type

class Projects(models.Model):
    project_types = models.ForeignKey(Project_types, on_delete=models.CASCADE)
    project = models.CharField(max_length=200)

    def __str__(self):
        return self.project

Сначала есть несколько проблем с вашей моделью.

Имена первых моделей не должны быть во множественном числе

Здесь Projects (должен быть Project) имеет один project_type, а Project_types (должен быть ProjectType) имеет один project.

Чтобы запустить нужный вам запрос:

Project_types.filter(project_type='games').item_set.all()

правильным запросом будет:

Project_types.filter(project_type='games').projects_set.all()

использовать проекты вместо элементов,

связанный менеджер основан на имени модели (в этом случае Projects становится projects_set)

смотрите здесь https://docs.djangoproject.com/en/3.2/topics/db/examples/many_to_one/

Атрибут .item_set не существует на экземпляре, который вы создали, выполнив:

Project_types(project_type='games')

Мне кажется, что вы пытаетесь получить все Projects типа 'games'.

Для этого вам придется использовать QuerySet класса Projects следующим образом:

Projects.objects.filter(project_types__project_type='games').all()

Дополнительно совет: попробуйте назвать все классы вашей модели, используя сингулярный CamelCase, чтобы их было легче понять. В вашем примере Project_types должно быть ProjectType, а Projects должно быть Project.

Вернуться на верх