首页 > 解决方案 > Django - 如何将过滤后的查询集传递给 Detailview

问题描述

我有客户端、服务器、用户模型。在 Client Detailview 我想显示属于该公司的服务器和用户。我该如何过滤?

模型.py

class Client(models.Model):
    name = models.CharField(max_length=50)
    def __str__(self):
        return self.name

class Server(models.Model):
    company = models.ForeignKey(Client, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    def __str__(self):
        return self.name

class User(models.Model):
    company = models.ForeignKey(Client, verbose_name="Company", on_delete=models.CASCADE)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    def __str__(self):
        return self.first_name + ' ' + self.last_name

视图.py

class clientdetails(LoginRequiredMixin, DetailView):
template_name = 'myapp/clientdetails.html'

def get_queryset(self):
    return Client.objects.all()

def get_context_data(self, **kwargs):
    context = super(clientdetails, self).get_context_data(**kwargs)
    context['servers'] = Server.objects.filter(** servers belonging to that client **)
    context['users'] = User.objects.filter(** servers belonging to that client **)
    return context

我如何实现这一目标?

标签: pythondjango

解决方案


如果您希望这是一个通用用例,即从服务器检索的所有对象都需要用于特定客户端。你可以看看使用limit-choices-to

class ClientDetails(LoginRequiredMixin, DetailView):
    template_name = 'myapp/clientdetails.html'
    model = Client

    def get_context_data(self, **kwargs):
        client = self.object
        context = super(ClientDetails, self).get_context_data(**kwargs)
        context['servers'] = Server.objects.filter(company=client)
        context['users'] = User.objects.filter(company=client)
        return context

或使用相关名称

 def get_context_data(self, **kwargs):
        context = super(ClientDetails, self).get_context_data(**kwargs)
        context['servers'] = self.object.server_set.all()
        context['users'] = self.object.user_set.all()
        return context

推荐阅读