简体   繁体   English

Django-Filter:使用与当前用户相关的queryset的ModelChoiceFilter

[英]Django-Filter: ModelChoiceFilter using queryset related to the current user

I am using Django-Filter library. 我正在使用Django-Filter库。

I have 2 models, Listing and ListingReview . 我有2个模型, ListingListingReview I would like to be able to create a filter for the ListingReview model, so that people can select which Listing they want to see reviews for. 我希望能够为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']

However, I don't understand why request is None , I get: 但是,我不明白为什么request is None ,我得到:

'NoneType' object has no attribute 'user' 'NoneType'对象没有属性'user'

What I need: For a given user , find the associated Listings using: Listing.objects.filter(posted_by=user) and pass it to the queryset parameter in the filter eg dynamically define the queryset based on current user. 我需要什么:对于给定的user ,使用以下Listing.objects.filter(posted_by=user)找到关联的清单: Listing.objects.filter(posted_by=user)并将其传递到过滤器中的queryset参数,例如,根据当前用户动态定义queryset。 Since every user owns a different set of listings. 由于每个用户都拥有不同的列表集。

尝试调用此方法时,是否在客户端请求中发送了参数user

How about using a custom filter method 如何使用自定义过滤器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)

I don't understand what is your problem but your idea and in specific your problem solved my problem. 我不明白您的问题是什么,但是您的想法,尤其是您的问题解决了我的问题。 In other words, I've done the exactly same thing as you have done and it worked for me. 换句话说,我所做的事情与您所做的完全相同,并且对我有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM