Json Django Rest框架:反序列化并从已验证的\u数据中获取主键

Json Django Rest框架:反序列化并从已验证的\u数据中获取主键,json,django,primary-key,django-rest-framework,nested-lists,Json,Django,Primary Key,Django Rest Framework,Nested Lists,我定义了一个嵌套模型Product,如下所示。每个产品可以属于许多产品列表 class Product(models.Model): product_id = models.AutoField(primary_key=True) product_name = models.CharField(max_length=50) class Productlist(models.Model): productlist_id = models.AutoField(primary_

我定义了一个嵌套模型
Product
,如下所示。每个
产品
可以属于许多
产品列表

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    product_name = models.CharField(max_length=50)

class Productlist(models.Model):
    productlist_id = models.AutoField(primary_key=True)
    productlist_name = models.CharField(max_length=50)
    product = models.ManyToManyField(Product, related_name='productlists')
相应的序列化程序包括:

class ProductlistSerializer(serializers.ModelSerializer):
    class Meta:
        model = Productlist
        fields = ('productlist_id', 'productlist_name',)

class ProductSerializer(serializers.ModelSerializer):
    productlists = ProductlistSerializer(many=True, required=False)

    class Meta:
        model = Product
        fields = ('product_id', 'product_name', 'product lists')

    def create(self, validated_data):
        #some codes
当我发布一个新的
产品
url(r'^api/products/$,views.ProductEnum.as_view()
)时,我想更新产品列表,以便将新产品添加到相应的产品列表中。我更喜欢使用的JSON文件是:

{
    "product_name": "product1"
    "productlist": [
        {
            "productlist_id": 1,
            "productlist_name": "list1",
        },
        {
            "productlist_id": 2,
            "productlist_name": list2"
        }
    ]
}
问题是,我无法从
验证的\u数据中获取
产品列表\u id
。在Django Rest框架中,您始终需要调用
来获取\u内部\u值()
用于反序列化数据并生成
验证的\u数据
。在进行了一些脱胶后,我检查了
DRF的代码
,并在
to\u internal\u value()
中找到以下代码片段:

因此,
validated_数据
将只包含以下数据:

{
    "product_name": "product1"
    "productlist": [
        {
            "productlist_name": "list1",
        },
        {
            "productlist_name": list2"
        }
    ]
}

如何获取产品列表的主键?提前感谢!

经过一番挖掘,我发现
只读
字段仅用于输出演示。您可以在
Django REST Framework
的官方github上找到类似的问题

因此,解决方案覆盖序列化程序中的
只读
字段,如下所示:

class ProductlistSerializer(serializers.ModelSerializer):
    productlist_id = serializers.IntegerField(read_only=False)

    class Meta:
        model = Productlist
        fields = ('productlist_id', 'productlist_name',)
{
    "product_name": "product1"
    "productlist": [
        {
            "productlist_name": "list1",
        },
        {
            "productlist_name": list2"
        }
    ]
}
class ProductlistSerializer(serializers.ModelSerializer):
    productlist_id = serializers.IntegerField(read_only=False)

    class Meta:
        model = Productlist
        fields = ('productlist_id', 'productlist_name',)