Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
Django 如何使用serializer方法字段处理主键相关数据_Django_Django Rest Framework - Fatal编程技术网

Django 如何使用serializer方法字段处理主键相关数据

Django 如何使用serializer方法字段处理主键相关数据,django,django-rest-framework,Django,Django Rest Framework,我想使用serializer方法字段来获取具有某些业务规则的数据 class Product(models.Model): name = models.CharField() class Stock(models.Model): product = models.ForeignKey(Product, on_delete=models.Cascade, related_name='stock') current = models.BooleanField(default

我想使用serializer方法字段来获取具有某些业务规则的数据

class Product(models.Model):
    name = models.CharField()

class Stock(models.Model):
    product = models.ForeignKey(Product, on_delete=models.Cascade, related_name='stock')
    current = models.BooleanField(default=True)
    quantity = models.IntegerField()

class ProductSerializer(serializers.ModelSerializer):
    productstock = serializers.SerializerMethodField()
    #GET LATEST CURRENT STOCK-QUANTITU
    class Meta:
        model = Product
        fields = [

            'name',
            'productstock'
        ]
我希望得到如下输出: { 名称:'笔记本电脑', 产品库存:18


}

我现在无法检查,但应该是这样的:

class ProductSerializer(serializers.ModelSerializer):
    productstock = serializers.SerializerMethodField()
    #GET LATEST CURRENT STOCK-QUANTITU
    class Meta:
        model = Product
        fields = [
            'name',
            'productstock'
        ]

    def get_productstock(self, obj):
        stock = Stock.objects.filter(product__name=obj.name)
        return stock.quantity
说明:

序列化程序方法始终由get_u+variable_name构建,并将curren对象作为参数。然后,您应该能够过滤您的股票模型,productstock值将成为您通过此方法返回的值。希望对你有帮助

更新

我想现在我明白你的意思了。在通过序列化程序传递查询集之前,应该进行过滤。因此,我建议重写get_queryset方法。在您的视图中,只需添加下面的函数,它只会过滤current=True的产品。我的例子是APIView,但它适用于每个DRF视图,因为它们都继承了APIView

class YourViewClass(APIView):

...

    def get_queryset(self):
        return Product.objects.filter(stock__current=True)
解释


在filter方法中,引用外键字段的相关名称,然后使用双下划线加上要筛选的字段。希望对您有用。

谢谢。但我的问题是只获取当前=真实库存它现在是否具有您试图实现的产出?