如何将请求传递给另一个序列化程序进行验证



我的数据库中有两个表用于插入产品记录。我将产品信息存储在Product表中,其余信息(如Pirce、Quantity等(存储在另一个表ProductStock中。

我正计划将数据发送到类似这样的服务器。

{
"name":'product name',
"brand":"socialcodia"
"product_stock":{
"price":"100",
"quantity":"50"
}
}

我可以很容易地验证来自ProductSerializer的产品信息。但我没有任何完美的想法来验证ProductStockSerializer数据。

产品序列化程序

from rest_framework import serializers
from .models import Product
from .models import Medical
class ProductSerializer(serializers.ModelSerializer):

medical = serializers.CharField(read_only=True)
id = serializers.CharField(read_only=True)
is_visible = serializers.CharField(read_only=True,default=True)
class Meta:
model = Product
fields = ['id','medical','category','item','brand','is_visible']
def validate(self, attrs):
request = self.context.get('request')
attrs['medical'] = Medical.objects.get(pk=request.info.get('medical'))
return attrs

在这里,我也想验证product_stock信息。因为只有一个请求。那么,有没有任何方法可以将ProductStockSerializer导入ProductSerializer并将数据传递给该序列化程序。然后进行验证。

ProductStockSerializer

from rest_framework import serializers
from .models import ProductStock
from medical.models import Medical
class ProductStockSerializer(serializers.ModelSerializer):
medical = serializers.CharField(read_only=True)

class Meta:
model = ProductStock
fields = ['medical','distributer','product','variant','batch','purchase_price','price','quantity','location','low_stock','expire_date']

def validate(self, attrs):

attrs['medical'] = Medical.objects.get(self.context.get('request').info.get('medical'))
batch = attrs.get('batch')
purchase_price = attrs.get('purchase_price')
price = attrs.get('price'),
if len(batch) < 3 or len(batch)  > 30:
raise serializers.ValidationError("Invalid Batch Number")
if type(purchase_price) != int or type(purchase_price) != float:
raise serializers.ValidationError("Invalid Purchase Price")
if type(price) != int or type(price) != float:
raise serializers.ValidationError("Invalid Price")
return attrs;

ProductViewSet

class ProductViewSet(ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticated]

def get_queryset(self):
if self.request.user.is_superuser:
return Product.objects.all()
return Product.objects.filter(medical=self.request.info['medical'])

我真的不知道该怎么做。感谢

ProductStockSerializer数据作为字段添加到ProductSerializer中如何

class ProductSerializer(serializers.ModelSerializer):
...
product_stock = ProductStockSerializer()
class Meta:
fields = [ ... , product_stock ]

您应该能够在验证中使用product_stock。如果您计划使用嵌套序列化程序创建ProductStock对象,请确保阅读可写嵌套序列化程序。

@coderiot的答案是绝对正确的。

这是我如何解决的,但它的代码比上面的答案多得多。

class ProductSerializer(serializers.ModelSerializer):

medical = serializers.CharField(read_only=True)
id = serializers.CharField(read_only=True)
is_visible = serializers.CharField(read_only=True,default=True)
stock = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Product
fields = ['stock','id','medical','category','item','brand','is_visible']
def get_stock(self,instance):
return ProductStockSerializer(instance=instance.stock,context=self.context).data
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.fields['stock'] = ProductStockSerializer(context=self.context)
def validate(self, attrs):
request = self.context.get('request')
attrs['medical'] = Medical.objects.get(pk=request.info.get('medical'))
return attrs

相关内容

最新更新