2016-05-14 16 views
0

ユーザーがサブスクライバであるかどうかに関わらず、どのようにユーザー投稿をフィルタリングできますか?'QuerySet'オブジェクトに属性 'subs'がありません

は 'クエリセット' オブジェクトは、私はここでカスタムユーザー

class Every(AbstractBaseUser): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, unique=True) 
    name = models.CharField(max_length=30, blank=True) 

を使用していない属性 '潜水艦'

を持っているポストモデルである:

class Post(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    text = models.TextField(max_length=1200) 

加入者モデル:

class Sub(models.Model): 
    user = models.OneToOneField(User, related_name='user') 
    subs = models.ManyToManyField(User, blank=True, related_name='subs') 

ビュー帽子私は使用しようとしています:

def tape(request, every_id): 
    context = {} 
    context.update(csrf(request)) 
    post_form = PostForm 
    pform = post_form 
    sub = Sub.objects.filter(subs=every_id)# here I get users that intersting for my user 
    tape = Post.objects.filter(user=sub.subs).order_by("-timestamp") 
    username = request.user 
    context = {"username": username, "pform": pform, "tape": tape, "sub": sub,} 
    return render(request, 'tape.html', context) 
+0

これは '' every_idものです:-)でも、もう少しで私たちはここにフィルターポストに

を開始する前に、サブスクリプションのと加入者のIDを取得する必要がありますか? – Anoop

+0

every_idは、ユーザーの追加モデルのIDです。 '' 'Every(AbstractBaseUser):' '' ここに私はアドレス、趣味、名前を追加できます... –

答えて

1

実際には、クラスビューを使用する方が良いでしょう。しかし、ここに通常の見解の答えがあります。私たちは、

def get_user_id_list(user): 
    """Returns a list of subscribers's ids""" 
    try: 
     sub = user.user 
    Sub.DoesNotExist: 
     return [] 
    return sub.subs.all().values_list('user_id', flat=True) 


def get_user_id_list_2(user): 
    """Returns a list of subscription's ids""" 
    return user.subs.values_list('user_id', flat=True) 


def tape(request): 
    pform = PostForm 
    user_id_list = get_user_id_list_2(request.user) 
    logger.info('user_id_list = {}'.format(user_id_list)) 
    tape = Post.objects.filter(user_id__in=user_id_list).order_by("-timestamp") 
    username = request.user 
    context = { 
     "username": username, 
     "pform": pform, 
     "tape": tape, 
     "sub": sub, 
    } 
    return render(request, 'tape.html', context) 
関連する問題