Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django rest框架中,如何从父模型中有外键的子模型中筛选字段?_Python_Django_Api_Search_Filter - Fatal编程技术网

Python 在django rest框架中,如何从父模型中有外键的子模型中筛选字段?

Python 在django rest框架中,如何从父模型中有外键的子模型中筛选字段?,python,django,api,search,filter,Python,Django,Api,Search,Filter,我正在尝试在drf中构建一个API,用于列出不同的旅行包。我有两个模型。包是一个父模型,Topactivities是一个子模型,它具有包模型的外键。现在,当我点击localhost:8000/api/allpackages-api时,我需要列出所有没有问题的包。问题是我想过滤查询中带有活动标题的包。例如:如果我执行localhost:8000/api/allpackages?activities=trekking,我需要显示所有具有trekking活动的包。但是,活动不是包中的字段。我正在尝试使

我正在尝试在drf中构建一个API,用于列出不同的旅行包。我有两个模型。包是一个父模型,Topactivities是一个子模型,它具有包模型的外键。现在,当我点击localhost:8000/api/allpackages-api时,我需要列出所有没有问题的包。问题是我想过滤查询中带有活动标题的包。例如:如果我执行localhost:8000/api/allpackages?activities=trekking,我需要显示所有具有trekking活动的包。但是,活动不是包中的字段。我正在尝试使用过滤器后端

以下是我的模型:

class Package(models.Model):

    destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
    package_name = models.CharField(max_length=255)
    featured = models.BooleanField(default=False)
    price = models.IntegerField()
    duration = models.IntegerField(default=5)
    discount = models.CharField(max_length=255, default="15% OFF")
    discounted_price = models.IntegerField(default=230)
    savings = models.IntegerField(default=230)
    special_discount = models.BooleanField(default=False)
    rating = models.IntegerField(choices=((1, 1),
                                          (2, 2),
                                          (3, 3),
                                          (4, 4),
                                          (5, 5))
                                 )

    image = models.ImageField(blank=True)
    thumbnail = ImageSpecField(source='image',
                                      processors=[ResizeToFill(100, 50)],
                                      format='JPEG',
                                      options={'quality': 60})
    content =RichTextField()
    highlights = RichTextField()
    itinerary = RichTextField()
    image_1= models.ImageField(blank=True,null = True)
    image_2= models.ImageField(blank=True,null = True)
    image_3= models.ImageField(blank=True,null = True)
    date_created = models.DateField()


    def __str__(self):
        return self.package_name

class TopActivities(models.Model):
    package = models.ForeignKey(Package, on_delete=models.CASCADE, related_name='activities')

    # destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
    image = models.ImageField(blank=True)
    thumbnail = ImageSpecField(source='image',
                                      processors=[ResizeToFill(100, 50)],
                                      format='JPEG',
                                      options={'quality': 60})
    title = models.CharField(max_length=64)
    description = models.TextField(blank=True)
以下是我的看法:

class AllPackageAPIView(ListAPIView):
    queryset = Package.objects.all()
    serializer_class = PackageSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['featured', 'special_discount',]
以下是我的序列化程序:

class PackageSerializer(serializers.ModelSerializer):
    
    activities = ActivitiesSerializer(many=True)
    class Meta:
        model = Package
        fields = ['id', 'destination', 'package_name', 'duration', 'featured', 'price', 'discount', 'discounted_price',
                            'savings', 'special_discount', 'rating', 'image', 'date_created', 'activities']

class ActivitiesSerializer(serializers.ModelSerializer):
    class Meta:
        model = TopActivities
        fields = ['image', 'title', 'description']
我的网址:

path('api/allpackages', views.AllPackageAPIView.as_view(), name='api-allpackages'),
APi图片如下:


您应该尝试覆盖get_queryset()方法,并通过self.request.query_参数['your_param_here']访问查询参数。我应该在包序列化程序中获取_queryset(),因为在视图中,所有PackageApiView活动文件都无法识别DHI Saroj Paudel!这是一个更复杂的用例,所以我建议您熟悉django filter()并编写自己的filterset。在那里,你可以随心所欲地构建你的过滤器和查找,并且与你当前使用的快捷方式一样更加灵活。嗨,哈利!。我们可以用get_queryset方法吗??因为我想那会容易得多。