1

'계정'페이지에서 드라이버에 속한 Route 모델의 데이터를 렌더링하여 지금까지 데이터베이스에 저장 한 leave_from, destination 등의 데이터를 표시하려고합니다.Django - 사용자 필터링

Models.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 

나는 다양한 검색어 세트와 함께 연주 한 아래가 점점에 가장 가까운 (내 생각 ... 나는 코딩과 장고에 새로운 해요).

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) 

는 그 드라이버에 대한 경로에서 데이터의 인스턴스의 동일한 수를 표시하는 사용자를 얻을 수 있어요.

템플릿 :

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

나는 모든 다른 변화를 시도했습니다하지만이 느낌은 나에게 가장 가까운 가지고 적어도 사용자에게 경로에서 데이터가이 사용자가 동일한 횟수를 반환으로 . 이 경우 경로에 저장된 2 개의 경로가 있으므로 사용자 이름이 두 번 반환됩니다. 필자는 다른 사용자를 대상으로 테스트를했으며 항상 일치합니다.

나는 도처에서 보았습니다. 그리고 지금까지 어떤 도움을 주셔서 감사합니다.

답변

3

당신이 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 %} 
+0

정말 고마워요! 이 작품 - 도움을 주셔서 감사합니다 –

2

포켓 킹스 '솔루션입니다 위대하고 받아 들여야한다. 이것은 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 %} 
1

이 드라이버의 경로에 기록하려면 가장 간단한 방법입니다.

views.py

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

템플릿

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