Django中如何将前端传入的颜色数组存储为数据库独立条目?
解决Django REST Framework中JSON数组关联表存储问题
1. 修正模型定义
你的模型存在两处语法错误,同时可以优化外键命名以贴合Django规范:
from django.db import models class Product(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=30) stock = models.IntegerField(default=0) def __str__(self): return self.name # 原代码return self.product是错误的,改为self.name class Color(models.Model): # 外键字段名改为product,Django会自动在数据库生成product_id列,更符合规范 product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="colors") id = models.AutoField(primary_key=True) name = models.CharField(max_length=30) isAvailable = models.BooleanField(default=False) def __str__(self): return self.name # 原代码return self.color是错误的,改为self.name
添加related_name="colors"后,可通过product.colors快速访问该产品关联的所有颜色实例。
2. 编写DRF序列化器
自定义序列化器的create方法,先创建Product实例,再批量生成对应的Color记录:
from rest_framework import serializers from .models import Product, Color class ColorSerializer(serializers.ModelSerializer): class Meta: model = Color fields = ["name", "isAvailable"] class ProductSerializer(serializers.ModelSerializer): # 用many=True标识这是数组字段 color = ColorSerializer(many=True) class Meta: model = Product fields = ["name", "color"] def create(self, validated_data): # 分离颜色数据与产品数据 colors_data = validated_data.pop("color") # 创建产品实例 product = Product.objects.create(**validated_data) # 批量构建颜色实例并写入数据库 color_instances = [ Color(product=product, **color_data) for color_data in colors_data ] Color.objects.bulk_create(color_instances) return product
如果需要统一设置Color的isAvailable字段,可在批量创建时指定,比如Color(product=product, isAvailable=True, **color_data)。
3. 视图与路由配置
使用DRF的CreateAPIView快速实现接收请求并保存数据:
from rest_framework import generics from .models import Product from .serializers import ProductSerializer class ProductCreateView(generics.CreateAPIView): queryset = Product.objects.all() serializer_class = ProductSerializer
在urls.py中配置路由:
from django.urls import path from .views import ProductCreateView urlpatterns = [ path("products/", ProductCreateView.as_view(), name="product-create"), ]
完成以上配置后,向/products/发送POST请求并传入你提供的JSON数据,系统会自动创建对应的Product记录和两条Color记录,完全匹配你期望的数据库结构。
内容的提问来源于stack exchange,提问作者Paula Chittaro
相关产品推荐
相关产品推荐

