【问题标题】:Django Rest Framework - get foreignkey id from value when insertingDjango Rest Framework - 插入时从值中获取外键ID
【发布时间】:2018-12-16 20:51:48
【问题描述】:

在寻找可能是与 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.

This was the closest I got to an answer 当我执行以下操作时,它实际上会插入:

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

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

如果您有相关模型,这会更容易。但是注释掉的 slugrelatedfield 是你应该这样做的方式,使用实际的字段名称:

prodName = serializers.SlugRelatedField(read_only=False, slug_field='productid')

【讨论】:

  • 到目前为止已经尝试了几种方法,但没有通过以下错误:Relational field must provide a 'queryset' argument, override 'get_queryset', or set read_only='True'.我也添加了相关模型
  • 终于得到了prodName = serializers.SlugRelatedField(read_only=False, slug_field='productid', queryset=Productlist.objects.all())
【解决方案2】:

你的序列化器错误,你必须使用关系序列化器。

prodName = ProductlistSerializer(many = False)

但我发现你的模型定义很混乱

【讨论】:

    猜你喜欢
    • 2015-03-27
    • 2013-10-24
    • 2014-03-24
    • 2018-05-03
    • 2018-03-17
    • 2021-02-26
    • 1970-01-01
    • 2017-08-15
    • 2019-07-02
    相关资源
    最近更新 更多