python - 我应该如何发送Post请求来创建具有外键关系的对象

标签 python django api django-rest-framework

嘿,我正在尝试学习 Django Rest 框架,但在尝试通过 POST 请求在我的数据库中创建新产品时遇到了困难

我有一个名为 Product 的模型,其中包含一堆用于所有产品详细信息的字段,其中一个字段(品牌)是包含我所有品牌的另一个表的外键

当发送创建新产品的发布请求时,我希望能够传递品牌 ID 并且它应该保存

产品模型的序列化器嵌套了品牌,我无法弄清楚如何在发布请求中正确构建产品信息

序列化器.py

class ProductSerializer(serializers.ModelSerializer):
    brand = BrandSerializer(required=False, read_only=False)
    vendors = VendorSerializer(many=True, required=False)

    class Meta:
        model = Product
        fields = "__all__"

    def create(self, validated_data):
        product_brand = validated_data.pop("brand")
        print(product_brand)
        product_instance = Product.objects.create(**validated_data)
        Brand.objects.create(product_brand)
        return product_instance

模型.py

class Brand(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500)
    sku = models.CharField(max_length=50)
    brand = models.ForeignKey(
        Brand,
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )
    added = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name + ": " + self.description

POST 请求的 JSON 示例

{
        "id": 1,
        "brand": {
            "id": 2,
            "name": "Dewalt"
        },
        "name": "Product1",
        "description": "the first product",
        "sku": "111111111",
        "added": "2022-12-28T19:09:30.007480Z",
        "updated": "2022-12-29T15:10:36.432685Z"
}

我什至不知道是否应该使用嵌套序列化器或者是否有更好的方法来做到这一点。我希望当我请求获取产品时,品牌信息应包含在其中,而不仅仅是 ID

我在某处读到我必须重写默认的 create() 方法,但我不确定那应该做什么

我不想在发帖时创建新品牌,我只是希望在创建新产品时能够选择现有品牌

如果有人能指出我正确的方向,那就太棒了

最佳答案

我是这样做的,但如果有更好的解释/答案,请遵循

class ProductSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()

    class Meta:
        model = Product
        fields = ('id', 'name', 'description', 'sku', 'brand', 'added', 'updated')

    def create(self, validated_data):
        brand_data = validated_data.pop('brand')

        # get/(create if not exists) brand
        brand, _ = Brand.objects.get_or_create(
            name=brand_data['name']
        )

        # print(brand_data) # OrderedDict([('name', 'adgg')])
        product = Product.objects.create(brand=brand, **validated_data)

        return product

关于python - 我应该如何发送Post请求来创建具有外键关系的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75399522/

相关文章:

python - 如何将命令行工具添加到python包

python - 类型错误 : unsupported operand type(s) for +: 'int' and 'NoneType' when sum a list

python - C Python : Running Python code within a context

python - 如果 Django super 用户不以非交互方式存在,如何创建它?

python - 如何提高 django 管理站点上数据库中可视化数据的性能?

python - 使用 Python 创建动态更新图

django - 如何使用 Django Rest API 上传文件

java - Eclipse插件开发: get project infos

javascript - React - componentDidMount API 调用未获取数据?

javascript - 在ReactJS中使用axios GET作为axios POST