2017-10-29 3 views
1

おはよう、コメントされたユーザーによるフィルタ

私は、Perfil、Puesto、Tagsの3つのモデルをお互いにリンクしています。 PerfilモデルはAbstractuserから継承します。このモデルには、以下に示すモデルで作成された追加情報「puesto de trabajo(job)」が追加されています。

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、見て:

models.py

class Tags(models.Model): 
    nombre = models.CharField(max_length=20) 

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

を私が持っているコメントを作成するには、別のaplicationを作成しているほかタグを追加するオプション。

目的は、タグがユーザープロファイルタグに一致するコメントを表示することです。それに到達するために:これは動作しません

views.py

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) 

を、それはクレイジーです!誰かが、ユーザーのタグに合ったコメントだけを表示する方法を知っていますか?

ありがとうございました!

+0

申し訳ありませんが、答えが見つかりません。あなたが私を助けることができれば、私は感謝しています。ありがとうございました – JohnWire

答えて

0

特定のユーザーのタグは、Perfil.nom_puesto.etiquetas.all()にあります。特定のユーザーと共通のタグを持っているだけComentarioオブジェクト、Comentariotags呼ばTagsに多対多の関係を持っていると仮定すると見つけるに

__inにオブジェクトのリストを渡す

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

は、それらを変換し、フードの下の主キーにDjangoはすべてのマッチに対してComentarioオブジェクトを持つクエリーセットを作成します。ユーザーとコメントに複数のタグが共通していた場合、重複した結果が表示されるため、distinct()を使用します。

関連する問題