嘿,我正在尝试学习 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/