Как искать объект внешнего ключа django - PullRequest
0 голосов
/ 19 июня 2020

Я создаю очередь завершения задач, в которой люди создают проекты, а затем добавляют сообщения в этот конкретный c проект, что-то вроде комментариев к сообщению в блоге. Я создаю подробное представление для модели Project и хочу выполнить поиск по всем сообщениям, используя Project в качестве параметра, потому что мне нужны только сообщения, относящиеся к данному c Project. Проблема в том, что я не могу понять, как использовать модель, которая в настоящее время используется в качестве параметра поиска в подробном представлении

Вот мой models.py

class MyProjects(models.Model):
    title = models.CharField(max_length=30)
    description = models.CharField(max_length=140)

class Post(models.Model):

    title = models.CharField(max_length=50)
    content = models.TextField()
    project = models.ForeignKey(MyProjects, on_delete=models.CASCADE, null=True, default=None)

А вот мой views.py

class ProjectView(DetailView):
    model = MyProjects


    def get_context_data(self, **kwargs):
        CurrentProject = get_object_or_404(MyProjects, title=self.kwargs['MyProjects'])
        completed = Post.objects.filter(status='Completed', project= CurrentProject)
        inProgress = Post.objects.filter(status='InProgress', project= CurrentProject)
        posts = Post.objects.filter(project= CurrentProject)
        Features = Post.objects.filter(ticket_type='Features', project= CurrentProject)

        context = super().get_context_data(**kwargs)
        context['posts '] = posts 
        context['Features '] = Features 
        context['completed '] = completed 
        context['inProgress '] = inProgress 
        context['projects'] = projects


        return context

1 Ответ

1 голос
/ 19 июня 2020

Если я прав, ваша цель - получить все сообщения, относящиеся к объекту проекта, полученному из текущего запроса. Я предполагаю, что ваше приложение urls.py включает что-то вроде:

urlpatterns = [
# ...
  path('projects/<int:pk>/', views.ProjectView.as_view())
]

Затем DetailView выполняет всю тяжелую работу, и вам просто нужно сделать следующее в вашем views.py

class ProjectView(DetailView):
    model = MyProjects

    def get_context_data(self, **kwargs):
        current_project = self.get_object()  # Here's where the magic happens !
        completed = Post.objects.filter(status='Completed', project=current_project)
        inProgress = Post.objects.filter(status='InProgress', project=current_project)
        posts = Post.objects.filter(project= CurrentProject)
        features = Post.objects.filter(ticket_type='Features', project=current_project)

        context = super().get_context_data(**kwargs)
        context['posts'] = posts 
        context['Features'] = features 
        context['completed'] = completed 
        context['inProgress'] = inProgress 
        context['projects'] = projects

        return context

А благодаря другим django magi c вы могли бы сделать даже лучше

class ProjectView(DetailView):
    model = MyProjects

    def get_context_data(self, **kwargs):
        current_project = self.get_object()  # Here's where the magic happens !
        posts = current_project.post_set.all()
        completed = posts.filter(status='Completed')
        inProgress = posts.filter(status='InProgress')
        features = posts.filter(ticket_type='Features')

        context = super().get_context_data(**kwargs)
        context['posts'] = posts 
        context['Features'] = features 
        context['completed'] = completed 
        context['inProgress'] = inProgress 
        context['projects'] = projects

        return context
...