2017-10-29 1 views
1

안녕하세요,댓글 기록 된 사용자 별 필터

나는 Perfil, Puesto 및 Tags의 세 모델이 있습니다. Perfil 모델은 Abstractuser로부터 상속받습니다. 이 모델에는 아래에 표시된 모델에 추가 정보 'puesto de trabajo (job)'가 추가되었습니다.

models.py

from django.db import models 
from django.contrib.auth.models import AbstractUser 
from apps.Tags.models import Tags 

class Puesto(models.Model): 
    nombre_puesto = models.CharField(max_length=50) 
    etiquetas = models.ManyToManyField(Tags, blank = True) 

    def __str__(self): 
     return '{}'.format(self.nombre_puesto) 

class Perfil(AbstractUser): 

    nom_puesto = models.ForeignKey(Puesto, blank = True) 

    def __str__(self): 
     return '{}'.format(self.username) 

태그 모델이 다른 응용 프로그램에서 생성 , 봐 :

models.py를

나는이 의견을 작성하는 또 다른 aplication을 만든 외에도
class Tags(models.Model): 
    nombre = models.CharField(max_length=20) 

    def __str__(self): 
     return '{}'.format(self.nombre) 

옵션을 사용하여 태그를 추가하십시오.

목표는 태그가 사용자 프로필 태그와 일치하는 주석을 표시하는 것입니다. 위해서는 그에 도달 :이 작동하지 않습니다

class ComentarioListar (LoginRequiredMixin,ListView): 
    login_url='/' 
    redirect_field_name='redirigido' 
    model = Comentario 
    template_name = 'home/comentario_listar.html' 

    def get_queryset(self): 
     aa=Puesto.objects.filter(nombre_puesto=self.request.user.nom_puesto) 

     return Comentario.objects.exclude(autor__id=self.request.user.id) 
     b=Perfil.objects.filter(nom_puesto=self.request.user) 
     c=Puesto.objects.filter(nombre_puesto=b) 
     return Comentario.objects.filter(tag__id=c) 

views.py, 그것은 미친 짓이야! 누구든지 사용자의 태그에 맞는 댓글 만 표시하는 방법을 알고 있습니까?

답변 해 주셔서 감사합니다.

+0

죄송하지만 답변을 찾을 수 없습니다. 네가 나를 도울 수 있다면 나는 감사 할 것이다. 고맙습니다 – JohnWire

답변

0

주어진 사용자의 태그는 Perfil.nom_puesto.etiquetas.all()에 있습니다.

>> user_tags = request.user.nom_puesto.etiquetas.all() 
>> matching_comments = Comentario.objects.filter(tags__in = user_tags).distinct() 

로 변환 __in에 개체의 목록을 전달 : Comentario 가정

가 특정 사용자와 공통 태그가있는 경우에만 Comentario 객체를 찾으려면

tags라는 Tags에 다 대다 관계를 가지고 두건의 밑에 주요 열쇠에; Django는 매치마다 Comentario 객체를 가진 쿼리 세트를 생성합니다. 사용자와 댓글에 공통된 태그가 여러 개있는 경우 중복 결과가 표시되므로 distinct()을 사용하십시오.