代码之家  ›  专栏  ›  技术社区  ›  t_om

Django-按用户筛选

  •  1
  • t_om  · 技术社区  · 7 年前

    我想在他们的“账户”页面中呈现属于司机的路线模型中的数据,以便显示他们目前保存在数据库中的leave_from、destination等数据。

    模型。py:

    class Driver(models.Model):
        user = models.OneToOneField(User, default=1)
        first_name = models.CharField(max_length=120, blank=True, null=True)
        last_name = models.CharField(max_length=120, blank=True, null=True)
        tel = models.CharField(max_length=120, blank=True, null=True)
        slug = models.SlugField(max_length=120, unique=True)
        timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
        updated = models.DateTimeField(auto_now_add=False, auto_now=True)
    
        def __str__(self):
            return self.user.username
    
        def get_absolute_url(self):
            return reverse("account", kwargs={"slug": self.slug})
    
        def save(self, *args, **kwargs):
            self.slug = slugify(self.first_name)
            super(Driver, self).save(*args, **kwargs)
    
    class Route(models.Model):
        leave_from = models.CharField(max_length=120, blank=True, null=True)
        destination = models.CharField(max_length=120, blank=True, null=True)
        date = models.DateField(auto_now_add=False, auto_now=False)
        time = models.TimeField(auto_now_add=False, auto_now=False)
        driver = models.ForeignKey(Driver, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.leave_from
    

    我玩过各种查询集,下面是最接近的(我想…我对编码和Django是新手)。

    意见。py:

    def route(request, slug):
        routedetails = Driver.objects.filter(route=request.user.driver.route_set.all())
        context = {
            "routedetails": routedetails,
            }
        return render(request, "route.html", context)
    

    有了它,我可以让用户在该驱动程序的路径中显示相同数量的数据实例。

    模板:

        {% for route in routedetails %}
            <p>{{ route.user }}</p>
        {% endfor %}
    

    我已经尝试了所有不同的变体,但我觉得这是最接近的,因为它至少可以返回给用户相同次数的数据。在这种情况下,Route中保存了2条路由,因此用户名会返回两次。我在其他用户身上测试过,它总是匹配的。

    我到处都找过了,这就是我能得到的,非常感谢任何帮助。

    3 回复  |  直到 7 年前
        1
  •  4
  •   VMatić    7 年前

    如果你想的话 Route 详细信息最好查询 路线 直接建模:

    routedetails = Route.objects.filter(driver__user=request.user)
    

    然后可以遍历 路线 模板中的对象:

    {% for route in routedetails %}
        <p>{{ route.leave_from }}</p>
        <p>{{ route.destination }}</p>
        ...
    {% endfor %}
    
        2
  •  3
  •   Borko Kovacev    7 年前

    Pocket Kings的解决方案很好,应该被接受。这是一个例子,如果你想显示多个司机的路线(管理页面?)为了避免N+1查询。这将预取与驱动程序相关联的所有路由,并向每个驱动程序及其特定路由添加属性routes,以便在以后消除不必要的SQL查询。

    from django.db.models import Prefetch
    
    drivers = Driver.objects.all()
    queryset = drivers.prefetch_related(Prefetch('route_set', queryset=Route.objects.filter(driver_id__in=drivers), to_attr='routes'))
    

    样板

    {% for driver in drivers %}
        {% for route in driver.routes %}
            <p>{{ route.leave_from }}</p>
            <p>{{ route.destination }}</p>
            ...
        {% endfor %}
    {% endfor %}
    
        3
  •  1
  •   Saji Xavier    7 年前

    要登录驾驶员路线,最简单的方法是。

    意见。py公司

    routes = request.user.driver.route_set.all()
    

    样板

    {% for route in routes %}
        {{ route.leave_from }}
        {{ route.destination }}
    {% endfor %}