Django Rest Framework, Как создать или обновить объект, который имеет вложенный сериализатор в качестве одного из своих полей
У меня есть две модели Product
и Variant
следующим образом
models.py
class Product(models.Model):
GENDER = [
('M', 'male'),
('F', 'female'),
('U', 'unisex'),
]
store = models.ForeignKey(
Store, on_delete=models.CASCADE, related_name='products')
name = models.CharField(max_length=80)
slug = models.SlugField(max_length=200, unique=True, blank=True, null=True)
description = models.TextField()
brand = models.CharField(max_length=200, blank=True, null=True)
model = models.CharField(max_length=200, blank=True, null=True)
gender = models.CharField(max_length=20, choices=GENDER)
image_1 = models.URLField()
image_2 = models.URLField()
category = models.ForeignKey(
'Category', related_name="products", on_delete=models.CASCADE, null=True, blank=True)
return_policy = models.IntegerField(null=True, blank=True)
in_warehouse = models.BooleanField(default=False)
is_approved = models.BooleanField(default=False)
is_rejected = models.BooleanField(default=False)
is_disabled = models.BooleanField(default=False)
is_deleted = models.BooleanField(default=True)
score = models.IntegerField(default=0)
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(null=True, blank=True)
def __str__(self):
return self.name
class Variant(models.Model):
COLORS = [
('black', 'Black'),
('grey', 'Grey'),
('white', 'White'),
('blue', 'Blue'),
('green', 'Green'),
('yellow', 'Yellow'),
('orange', 'Orange'),
('red', 'Red'),
('purple', 'Purple'),
('gold', 'Gold'),
('silver', 'Silver'),
('brown', 'Brown'),
('pink', 'Pink'),
('colorless', 'Colorless'),
('multi-colored', 'Multi Colored'),
]
SIZES = [
('xxs', 'XXS'),
('xs', 'XS'),
('s', 'S'),
('m', 'M'),
('l', 'L'),
('xl', 'XL'),
('xxl', 'XXL'),
('xxxl', 'XXXL')
]
product = models.ForeignKey(
Product, on_delete=models.CASCADE, related_name="variants", null=True, blank=True)
is_default = models.BooleanField(default=False)
price = models.FloatField()
old_price = models.FloatField(blank=True, null=True)
quantity = models.IntegerField()
size = models.CharField(
max_length=20, choices=SIZES, null=True, blank=True)
shoe_size = models.IntegerField(null=True, blank=True)
color = models.CharField(max_length=20, choices=COLORS)
image = models.URLField()
is_deleted = models.BooleanField(default=True)
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(null=True, blank=True)
def __str__(self):
return self.product.name + " variant"
Я хочу создать продукт, передавая список variants
, чтобы он мог автоматически создавать варианты с продуктом следующим образом
serializer.py
Данные, которые я пытался ПОСТИТЬ, были
{
"name": "first product",
"category": "tops",
"brand": "first",
"model": "test",
"description": "someone is the ehd kdvk kja avm elgm klrm gkrlng lkrgn rgn ognr bonr btklbn lbknb klnb rkngrkla rkgnrkgrng",
"image_1": File,
"image_2": File,
"gender": "U",
"variants": [
{
"price": "23000",
"quantity": "4",
"image": File,
"size": "m",
"shoe_size": "4",
"color": "black",
"is_default": true
},
{
"price": "44",
"quantity": "44",
"image": File,
"size": "m",
"shoe_size": "44",
"color": "black",
"is_default": false
},
{
"price": "22222",
"quantity": "22",
"image": File,
"size": "m",
"shoe_size": "22",
"color": "black",
"is_default": false
}
]
}
Но он бросил мне 415 Unsupported Media Type
{"detail":"Unsupported media type \"application/json;charset=UTF-8\" in request."}
Итак, как мне реализовать эту логику с помощью вложенных сериализаторов?
Я решил проблему, мне просто нужно было добавить заголовок
headers: { "Content-Type": "multipart/form-data" },