Django 如何使用serializer方法字段处理主键相关数据
我想使用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
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方法中,引用外键字段的相关名称,然后使用双下划线加上要筛选的字段。希望对您有用。谢谢。但我的问题是只获取当前=真实库存它现在是否具有您试图实现的产出?