【问题标题】:Django - filtering by userDjango - 按用户过滤
【发布时间】:2018-05-10 03:11:40
【问题描述】:

我想在他们的“帐户”页面中呈现属于司机的 Route 模型中的数据 - 因此显示他们迄今为止保存在数据库中的 leave_from、目的地等数据。

模型.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 的新手)。

Views.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)

这样我就可以让用户在 Route 中为该 Driver 显示相同数量的数据实例。

模板:

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

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

我到处寻找,这是我所能得到的,非常感谢任何帮助。

【问题讨论】:

    标签: python django django-models django-templates django-queryset


    【解决方案1】:

    如果你想要Route的详细信息最好直接查询Route模型:

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

    然后您可以遍历模板中的 Route 对象:

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

    【讨论】:

      【解决方案2】:

      Pocket Kings 的解决方案很棒,应该被接受。这是一个示例,如果您想显示多个驱动程序的路线(管理页面?)以避免 N+1 查询。这会预取与驱动程序关联的所有路由,并为每个驱动程序添加一个属性路由及其特定路由,以便以后消除不需要的 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】:

        要登录司机的路线,最简单的方法是。

        views.py

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

        模板

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

        【讨论】:

          猜你喜欢
          • 2014-01-31
          • 1970-01-01
          • 2015-08-15
          • 2012-03-23
          • 1970-01-01
          • 2012-07-07
          • 2019-08-23
          • 2021-01-04
          • 2014-09-24
          相关资源
          最近更新 更多