Python 使用Django rest框架从2个不同的表中筛选
您好,我正在尝试从两个具有一对多关系的不同表中筛选数据 我有产品表和规格表。1产品涉及多个规格清单。我在获取包括规格在内的所有产品信息方面没有任何问题。我还成功地筛选了产品表,如按类别和制造商筛选。但我想在过滤类别/制造商时也基于规范进行过滤 这是我的模型Python 使用Django rest框架从2个不同的表中筛选,python,django,django-models,django-rest-framework,django-filter,Python,Django,Django Models,Django Rest Framework,Django Filter,您好,我正在尝试从两个具有一对多关系的不同表中筛选数据 我有产品表和规格表。1产品涉及多个规格清单。我在获取包括规格在内的所有产品信息方面没有任何问题。我还成功地筛选了产品表,如按类别和制造商筛选。但我想在过滤类别/制造商时也基于规范进行过滤 这是我的模型 class Products(models.Model): product_partnumber = models.CharField(max_length=255) image_link = models.URLField(
class Products(models.Model):
product_partnumber = models.CharField(max_length=255)
image_link = models.URLField(default=None, blank=True, null=True)
pdf_link = models.URLField()
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'Products'
class ProductSpecification(models.Model):
product = models.ForeignKey(Products, related_name='specifications', on_delete=models.CASCADE)
specification = models.ForeignKey(Specification, related_name='specification_name', on_delete=models.CASCADE)
value = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
这是我的api和过滤代码。到目前为止,我只在一个表上成功过滤。我不知道如何在过滤器类中添加ProductSpecification模型
class NumberInFilter(filters.BaseInFilter, filters.NumberFilter):
pass
class ProductFilter(filters.FilterSet):
manufacturer__in = NumberInFilter(field_name='manufacturer', lookup_expr='in')
class Meta:
model = Products
fields = ['category', 'product_partnumber']
class ProductsView(viewsets.ModelViewSet):
queryset = Products.objects.all()
serializer_class = ProductsSerializers
filter_backends = [filters.DjangoFilterBackend]
filterset_class = ProductFilter
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = ProductsSerializers(data=request.data, many=many)
if serializer.is_valid():
serializer.save()
product=serializer.data
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(product, status=status.HTTP_201_CREATED)
class SpecificationView(viewsets.ModelViewSet):
queryset = Specification.objects.all()
serializer_class = SpecificationSerializers
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = SpecificationSerializers(data=request.data, many=many)
if serializer.is_valid():
serializer.save()
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
class ProductSpecificationView(viewsets.ModelViewSet):
queryset = ProductSpecification.objects.all()
serializer_class = ProductSpecificationSerializers
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = ProductSpecificationSerializers(data=request.data, many=many)
if serializer.is_valid():
serializer.save()
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
return Response(serializer.data, status=status.HTTP_201_CREATED)
我想选择product.category等于$val1、productspecification.specification=$val2、productspecification.value=$val3的产品的所有数据。但即使我只在1个规格上使用过滤器,如果一个产品有3个规格,我仍然希望获得所有这些数据
这是我获取的产品数据的格式,这仍然是我希望使用过滤器接收的数据格式
{
"id": 1,
"product_partnumber": "SSPA 1.2-1.4-800-RM",
"image_link": "https://www.aethercomm.com/wp-content/uploads/2019/05/SSPA-1.2-1.4-800-RM-300x112.png",
"pdf_link": "https://www.aethercomm.com/wp-content/uploads/2019/05/Data-Sheet_SSPA-1.2-1.4-800-RM.pdf",
"manufacturer": 1,
"manufacturer_details": {
"id": 1,
"name": "Aethercomm",
"url": "https://www.aethercomm.com/",
"created_at": "2020-09-08T03:48:34.200963Z"
},
"category": 2,
"category_details": {
"id": 2,
"name": "Amplifier",
"created_at": "2020-09-09T16:17:56.777422Z"
},
"subcategory": 45,
"specifications": [
{
"specification": 2,
"specification_details": {
"id": 2,
"name": "Frequency (min/max)",
"created_at": "2020-09-09T16:15:33.428022Z"
},
"value": "1200/1400"
},
{
"specification": 1,
"specification_details": {
"id": 1,
"name": "Description",
"created_at": "2020-09-09T16:15:33.301119Z"
},
"value": "High Power L Band Radar Pulsed Amplifier 800 Watts typical Peak Output Power 50 dB typ gain Typical Pulse Width is 100uSec to 1000 uSec Typical Duty Cycle is 10%"
}
]
}
抱歉发了这么长的邮件,提前谢谢。干杯 你试过这样的方法吗:
Products.objects.filter(category=$val1,specifications.specification=$val2,specifications.value=$val3)
我不知道你对最后一个的意思是什么:但即使我只对1种规格使用过滤器,如果一个产品有3种规格,我仍然希望获得所有这些数据。谢谢你的回复。有没有一种方法可以让我修改现有的过滤代码来实现这一点?谢谢