gpt4 book ai didi

django - 如何响应通过创建方法(ModelViewSet)插入的不同数据

转载 作者:行者123 更新时间:2023-12-04 14:53:46 25 4
gpt4 key购买 nike

我正在使用 Django + Django rest 实现具有 REST 架构的库存鞋管理器。

我使用从 DefaultRouter 继承的自定义路由器来为我的端点提供服务。

/resources/id端点我又添加了一个动词,POSTcustom_create 调用方法。

在这里你可以看到这个 custom_create方法:

View 集.py


class ShoeViewSet(viewsets.ModelViewSet):

queryset = Shoe.objects.all()
filter_class = ShoeFilter

def get_serializer_class(self):
if self.action == 'custom_create':
return StockPostSerializer
else:
return ShoeSerializer

def custom_create(self, request, *args, **kwargs):
data = {}

data['shoe'] = kwargs['pk']
data['size'] = request.data.get('size')
data['amount'] = request.data.get('amount')

serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)

return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)


我需要这样做,因为我有两个模型,下面你可以看到我的 3 个序列化程序:

序列化程序.py
class StockSerializer(serializers.ModelSerializer):

class Meta:
model = Stock
fields = ['size', 'amount']

class ShoeSerializer(serializers.ModelSerializer):
stock = StockSerializer(many=True, read_only=True)

class Meta:
model = Shoe
fields = ['description', 'provider', 'type', 'cost_price','sale_price','total_amount', 'stock']

class StockPostSerializer(serializers.ModelSerializer):

class Meta:
model = Stock
fields = ['shoe','size', 'amount']
retrieve ( GET 动词) 此端点的方法需要由 ShoeSerializer 序列化的数据,但 custom_create方法使用 StockPostSerializer 插入数据.如何使用插入的不同数据返回响应?

当我尝试使用此端点插入时,我收到 this错误消息,但是当我刷新页面时,我意识到内容已插入(如果我使用 postman 而不是 de DRF 前端,我不会收到任何错误消息,工作正常)。

我的怎么可以 custom_create方法响应正确吗?

你可以查看我的 github ,名称会有点不同,因为我在这里翻译了它,以便您更容易理解。

PS : 你可能已经注意到我的母语不是英语,所以在这里很难表达自己,但我正在尽我所能,并且学习越来越多。如果我的问题包含语法/索引错误,请更正它们,但您不必拒绝我,所以我正在努力学习!

最佳答案

我终于设法解决了这个问题,并且以比我之前尝试的方式更优雅的方式解决了这个问题。

我需要做的是:添加新的股票实例,为此我在端点资源/id 中为 POST 创建了一个新路由。

所以我能够重用默认路由器,删除 custom_create方法,只是修改了 serializers.py 文件。
它看起来像这样:

序列化程序.py

class StockSerializer(serializers.ModelSerializer):

class Meta:
model = Stock
fields = ['size', 'amount']

class ShoeSerializer(serializers.ModelSerializer):

stock = StockSerializer(many=True)

def update(self, instance, validated_data):
instance.description = validated_data.get(
'description', instance.description)
instance.provider = validated_data.get(
'provider', instance.provider)
instance.type = validated_data.get('type', instance.type)
instance.cost_price = validated_data.get(
'cost_price', instance.cost_price)
instance.salve_price = validated_data.get(
'sale_price', instance.sale_price)

stock = instance.stock.all()
stock_data = validated_data.get('stock', [])

for item_data in stock_data:
item_id = item_data.get('size', None)
if item_id is not None:
item_db = stock.get(size=item_id)
item_db.size = item_data.get('size', item_db.size)
item_db.amount = item_data.get('amount',item_db.amount)
item_db.save()
else:
Estoque.objects.create(
shoe = instance,
size = item_data['size'],
amount = item_data['amount']
)
instance.save()
return instance

class Meta:
model = Shoe
fields = ['_id','description', 'provider', 'type', 'cost_price','sale_price','total_amount', 'stock']


现在,通过 PATCH动词我可以添加新的 Stock 实例并更改现有的 Stock 实例。谢谢你的支持!

关于django - 如何响应通过创建方法(ModelViewSet)插入的不同数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com