You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:55:17