Django-Filter: ModelChoiceFilter, использующий набор запросов, связанный с текущим пользователем - PullRequest
0 голосов
/ 29 апреля 2018

Я использую библиотеку Django-Filter.

У меня есть 2 модели, Listing и ListingReview. Я хотел бы иметь возможность создать фильтр для модели ListingReview, чтобы люди могли выбирать, для какого Листинга они хотят видеть обзоры.

# models.py:
class Listing(models.Model):
    posted_by = models.ForeignKey('auth.User', related_name='listings', on_delete=models.CASCADE)

class ListingReview(models.Model)
    listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name='listing_reviews') 


# filters.py

def listings(request):
    # if request is None:
    #     return Listing.objects.none()
    return Listing.objects.filter(posted_by=request.user)


class ListingReviewFilter(django_filters.FilterSet):
    listing = django_filters.ModelChoiceFilter(
        name='listing', lookup_expr='isnull',
        empty_label='All listings',
        queryset=listings,
    )

    class Meta:
        model = ListingReview
        fields = ['listing']

Однако я не понимаю, почему request is None, я получаю:

Объект 'NoneType' не имеет атрибута 'user'

Что мне нужно: Для заданного user найдите связанные листинги с помощью: Listing.objects.filter(posted_by=user) и передайте его параметру queryset в фильтре, например, динамически определять набор запросов на основе текущего пользователя. Поскольку каждый пользователь владеет различным набором списков.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Как насчет использования пользовательского фильтра method

class ListingReviewFilter(django_filters.FilterSet):
    listing = django_filters.ModelChoiceFilter(
        name='listing',
        lookup_expr='isnull',
        empty_label='All listings',
        queryset=Listing.objects.all(),
        method='filter_listing',
    )

    class Meta:
        model = ListingReview
        fields = ['listing']

   def filter_listing(self, queryset, name, value):
       return queryset.filter(posted_by=self.request.user)
0 голосов
/ 29 апреля 2018

Вы отправляли параметр user в своем запросе от клиента, когда пытались вызвать этот метод?

...