Python 在django rest框架中,如何从父模型中有外键的子模型中筛选字段?
我正在尝试在drf中构建一个API,用于列出不同的旅行包。我有两个模型。包是一个父模型,Topactivities是一个子模型,它具有包模型的外键。现在,当我点击localhost:8000/api/allpackages-api时,我需要列出所有没有问题的包。问题是我想过滤查询中带有活动标题的包。例如:如果我执行localhost:8000/api/allpackages?activities=trekking,我需要显示所有具有trekking活动的包。但是,活动不是包中的字段。我正在尝试使用过滤器后端 以下是我的模型: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活动的包。但是,活动不是包中的字段。我正在尝试使
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方法吗??因为我想那会容易得多。