Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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框架从2个不同的表中筛选_Python_Django_Django Models_Django Rest Framework_Django Filter - Fatal编程技术网

Python 使用Django rest框架从2个不同的表中筛选

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(

您好,我正在尝试从两个具有一对多关系的不同表中筛选数据

我有产品表和规格表。1产品涉及多个规格清单。我在获取包括规格在内的所有产品信息方面没有任何问题。我还成功地筛选了产品表,如按类别和制造商筛选。但我想在过滤类别/制造商时也基于规范进行过滤

这是我的模型

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种规格,我仍然希望获得所有这些数据。

谢谢你的回复。有没有一种方法可以让我修改现有的过滤代码来实现这一点?谢谢