django - Django Rest Framework - 插入时从值中获取外键ID
问题描述
经过两天的搜索,我无法得到一个明确的答案,这可能是与 DRF 最常见的事情之一:
我有以下模型:
class ProcessedStockAmounts(models.Model):
prodName = models.ForeignKey(Productlist, on_delete=models.CASCADE, blank=False, unique=False)
amount = models.CharField(unique=False, max_length=255)
time = models.ForeignKey(StockTakingTimes, on_delete=models.CASCADE, blank=False, unique=False, default=1)
def __str__(self):
return str(self.prodName)
我正在通过我的 API 返回一个 JSON 对象,如下所示:
[{'prodName': 'SV1', 'amount': '1111111', 'time' : 1}]
当我插入带有值的 prodName 时,它没有问题,但显然我的用户不会知道 prodName ID,而只知道 prod 名称。因此,当我尝试插入上述内容时,出现以下错误:
ValueError: Cannot assign "'SV1'": "ProcessedStockAmounts.prodName" must be a "Productlist" instance.
这是我最接近答案的地方,当我执行以下操作时,它实际上会插入:
p = ProcessedStockAmounts(amount='33', prodName = Productlist.objects.get(productid = 'SV1'), time = StockTakingTimes.objects.get(times='06:00'))
p.save()
但是以这种方式提供数据显然违背了目的。
我的序列化程序如下所示:
class TestSerializer(serializers.ModelSerializer):
# time = serializers.SlugRelatedField(read_only=True, slug_field='time')
prodName = serializers.CharField()
# prodName = serializers.SlugRelatedField(read_only=True, slug_field='prodName')
class Meta:
model = ProcessedStockAmounts
fields = ('prodName','amount','time')
在我看来:
class InsertMultiProcessedStock(APIView):
def post(self, request, format='json'):
serializer = TestSerializer(data = request.data, many=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors)
产品型号:
class Productlist(models.Model):
productid = models.CharField(unique=True, max_length=20) # Field name made lowercase.
proddescription = models.CharField(db_column='prodDescription', max_length=255, blank=True, null=True) # Field name made lowercase.
packaging = models.ForeignKey(Packaging, on_delete=models.CASCADE, blank=True, null=True)
unitweight = models.FloatField(db_column='unitWeight', blank=True, null=True)
def __str__(self):
return self.productid
解决方案
如果你有相关的模型,这会更容易。但是注释掉的 slugrelatedfield 是你应该这样做的方式,使用实际的字段名称:
prodName = serializers.SlugRelatedField(read_only=False, slug_field='productid')
推荐阅读
- laravel - laravel auth 与 api 响应不同的数据库
- java - 强制 Maven 使用单个快照依赖项的本地副本
- android - 像这个图像 android 的自定义 Spinner 样式日历库
- android - RecyclerView 不显示数据,在任何地方都找不到解决方案
- java - 无法连接到具有相同连接工厂的另一个队列
- database - 哪个时间序列数据库用于持久和准确的历史数据
- python - Python读取大型xml文件并保存到csv文件
- visual-studio-code - 如何更改 Visual Studio Code 中特定语言的“注释行操作”行为?
- python - 恢复窗口而不设置为前景
- swift - 约束类型别名不使用约束