Как отобразить тему по подписке пользователя на тему - PullRequest
0 голосов
/ 28 декабря 2018

Я новичок в Django Python Framework.у меня есть модель Темы, модель SubChannel, модель SubChannelSubscription.

Я хочу отображать Темы в соответствии с тем, на что подписан пользователь.Например, если пользователь подписался только на категорию «Физика», он должен видеть только разделы «Физика»

Python 3 и Django 2

class SubChannelSubscription(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='subscriptions',
                             verbose_name='Subscriber', default=True)
    category = models.ForeignKey(SubChannel, related_name='Topic+', on_delete=models.CASCADE,
                                   verbose_name='SubChannel', default=True)

    def __str__(self):
        return '%(user)s\'s subscription to "%(category)s"' % {'user': self.user, 'category': self.category}

    class Meta(object):
        verbose_name = 'Subscription to SubChannel'
        verbose_name_plural = 'Subscriptions to SubChannel'


class Topic(models.Model):
    by = models.ForeignKey(User, on_delete=models.CASCADE, default=True)
    subject = models.CharField(max_length=150, unique=True, null=True)
    date_created = models.DateTimeField(auto_now_add=True)
    category = models.ForeignKey(SubChannel, on_delete=models.CASCADE, null=True, default=True, related_name='topics')
    file = RichTextUploadingField(blank=True, null=True)


    def __str__(self):
        return self.subject

    def get_absolute_url(self):
        return reverse('Topic_detail', kwargs={'pk': self.pk})

У меня отображается код Views.py для подписки пользователяниже

class SubChannelSubscriptionView(ListView):
    template_name = 'subscription.html'
    model = Topic

    def get_queryset(self):
        self.user = get_object_or_404(User, pk=self.kwargs['pk'])
        return SubChannelSubscription.objects.filter(user=self.user)

    def get_context_data(self, **kwargs):
        context = super(SubChannelSubscriptionView, self).get_context_data(**kwargs)
        context['topics'] = self.user
        context['top'] = Topic.objects.filter(category=1)
        return context

мой urls.py

path('subscription/<int:pk>', SubChannelSubscriptionView.as_view(), name='subscription'),

1 Ответ

0 голосов
/ 28 декабря 2018

Для вашего случая это выглядит так:

Topic.objects.filter(category__Topic+__user=self.user)

Но я рекомендую переименовать поле related_name из category в более подходящее имя, например:

class SubChannelSubscription(models.Model):
    ....
    category = models.ForeignKey(
        SubChannel, 
        related_name='subchannel_subs', 
        on_delete=models.CASCADE,
        verbose_name='SubChannel', 
        default=True
    )

Еслиу вас есть, что изменения запроса будут выглядеть так:

Topic.objects.filter(category__subchannel_subs__user=self.user)

И вы можете сделать

context['top'] = Topic.objects.filter(category__subchannel_subs__user=self.user)
...