【问题标题】:Django restframework : Filtering against query parametersDjango rest框架:过滤查询参数
【发布时间】:2018-09-01 02:59:46
【问题描述】:

我对根据查询参数进行过滤有疑问。

这是我的代码:

models.py

class Movie(models.Model):
    link = models.URLField()
    title = models.CharField(max_length=255, null=True)

class MovieTheater(models.Model):
    movietheater = models.ManyToManyField(Movie,null=True,blank=True,through="MovieShowtime")
    movie_theater = models.CharField(max_length=255, null=True)     
    city = models.CharField(max_length=255, null=True)     #east west north south

class MovieShowtime(models.Model):
    theater = models.ForeignKey( MovieTheater, null=True,blank=True,related_name = 'theater' )
    movie = models.ForeignKey( Movie, null=True,blank=True,related_name = 'movie' )
    time = models.TextField(null=True,blank=True)      

serialize.py

class MovieShowtimeSerializer(serializers.ModelSerializer):
    movietitle = serializers.CharField(source='movie.title')  
    theatertitle = serializers.CharField(source='theater.movie_theater')  
    area = serializers.CharField(source='theater.city') 

    class Meta:
        model = MovieShowtime
        fields = ( 'movietitle', 'theatertitle','time','area')

class MovieSerializer(serializers.ModelSerializer):
    movielink = serializers.HyperlinkedIdentityField(view_name='movie-detail')
    showtime = MovieShowtimeSerializer(many=True, read_only=True, source='movie')

    class Meta:
        model = Movie
        fields = ('movielink' ,'title','showtime'  )

urls.py:

urlpatterns = patterns('',
    url(r'^movies/$', MovieList.as_view(), name='movie-list'),
    url(r'^movies/(?P<pk>[0-9]+)$', MovieDetail.as_view(), name='movie-detail'),)

我想设计一个类似http://127.0.0.1:8000/movies/88?city=XXX的网址

当面积等于 'north' ,'east','south','west' 时会匹配结果

我必须连接两个模型,例如:

queryset = Movie.objects.filter(pk=88)
queryset2 = queryset.movietheater_set.filter(city='north')

但我不知道如何在我的views.py中做到这一点

请教我 - 谢谢。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你想要的是FilterSet。在您的情况下,将其添加到视图中可能就足够了:

    class MovieList(MovieMixin, generics.ListAPIView):
        filter_fields = ('showtime__theater__area',)
    

    您的模型还需要一些工作。相关名称允许您从外键访问。目前,当您可能需要 Movie.showtime 时,您会获得 Movie.movi​​e

    class MovieShowtime(models.Model):
        theater = models.ForeignKey( MovieTheater, null=True,blank=True,related_name = 'theater' )
        movie = models.ForeignKey( Movie, null=True,blank=True,related_name = 'showtime' )
        time = models.TextField(null=True,blank=True)      
    

    序列化需要一点调整:

    class MovieShowtimeSerializer(serializers.ModelSerializer):
        movietitle = serializers.CharField(source='movie.title')  
        theatertitle = serializers.CharField(source='theater.movie_theater')  
    
    class MovieSerializer(serializers.ModelSerializer):
        movielink = serializers.HyperlinkedIdentityField(view_name='movie-detail')
        showtime = MovieShowtimeSerializer(many=True, read_only=True, source='movie')
    

    您可以制作自定义过滤器以缩短 filter_fields url 参数。

    【讨论】:

    • 这将使网址像:/movies/?area=XXX
    • 但是 area 在 MovieTheater 中是 amanytomanyfield,而不是在电影中
    • 过滤器对序列化程序起作用,而不是模型。您的序列化程序描述了该字段的来源。我没有检查这种关系是否正确。
    • 对不起,我打错了。我打错了。是city = models.CharField(max_length=255, null=True)
    • 对不起,我还是听不懂。你能解释一下showtime__theater__area中的"__"是什么意思
    猜你喜欢
    • 2017-09-24
    • 2017-10-06
    • 2016-01-14
    • 2012-12-24
    • 2017-05-27
    • 2021-04-21
    • 2016-02-27
    • 1970-01-01
    • 2014-02-17
    相关资源
    最近更新 更多