代码之家  ›  专栏  ›  技术社区  ›  Alfa Bravo

django rest framework-插入时从值获取foreignkey id

  •  1
  • Alfa Bravo  · 技术社区  · 6 年前

    经过两天的搜索,我无法得到一个明确的答案,这可能是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}]
    

    当我插入带有值的prod name时,它没有问题,但很明显,我的用户将不知道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
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Roseman    6 年前

    prodName = serializers.SlugRelatedField(read_only=False, slug_field='productid')
    
        2
  •  0
  •   Hayden    6 年前