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

如何将ERD转换为Django model与schemas?

ERD关系图

Django Models 实现
from django.db import models
from django.utils import timezone

class Category(models.Model):
    name = models.CharField(max_length=100, verbose_name="分类名称")
    description = models.TextField(blank=True, null=True, verbose_name="分类描述")
    created_at = models.DateTimeField(default=timezone.now, verbose_name="创建时间")

    class Meta:
        db_table = "category"
        verbose_name = "商品分类"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=200, verbose_name="商品名称")
    description = models.TextField(blank=True, null=True, verbose_name="商品描述")
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="商品价格")
    stock = models.IntegerField(default=0, verbose_name="库存数量")
    category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name="products", verbose_name="所属分类")
    created_at = models.DateTimeField(default=timezone.now, verbose_name="创建时间")

    class Meta:
        db_table = "product"
        verbose_name = "商品信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Customer(models.Model):
    name = models.CharField(max_length=100, verbose_name="客户姓名")
    email = models.EmailField(unique=True, verbose_name="客户邮箱")
    phone = models.CharField(max_length=20, verbose_name="联系电话")
    address = models.TextField(verbose_name="收货地址")
    created_at = models.DateTimeField(default=timezone.now, verbose_name="创建时间")

    class Meta:
        db_table = "customer"
        verbose_name = "客户信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Order(models.Model):
    ORDER_STATUS_CHOICES = [
        ("pending", "待支付"),
        ("paid", "已支付"),
        ("shipped", "已发货"),
        ("completed", "已完成"),
        ("cancelled", "已取消"),
    ]
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name="orders", verbose_name="所属客户")
    order_date = models.DateTimeField(default=timezone.now, verbose_name="下单时间")
    total_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="订单总金额")
    status = models.CharField(max_length=20, choices=ORDER_STATUS_CHOICES, default="pending", verbose_name="订单状态")
    created_at = models.DateTimeField(default=timezone.now, verbose_name="创建时间")

    class Meta:
        db_table = "order"
        verbose_name = "订单信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return f"订单{self.id} - {self.customer.name}"


class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="order_items", verbose_name="所属订单")
    product = models.ForeignKey(Product, on_delete=models.PROTECT, related_name="order_items", verbose_name="对应商品")
    quantity = models.IntegerField(default=1, verbose_name="购买数量")
    unit_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="成交单价")
    created_at = models.DateTimeField(default=timezone.now, verbose_name="创建时间")

    class Meta:
        db_table = "order_item"
        verbose_name = "订单项"
        verbose_name_plural = verbose_name

    def __str__(self):
        return f"{self.order.id} - {self.product.name} * {self.quantity}"
DRF 序列化器(Schemas)实现
from rest_framework import serializers
from .models import Category, Product, Customer, Order, OrderItem

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = "__all__"


class ProductSerializer(serializers.ModelSerializer):
    category_name = serializers.CharField(source="category.name", read_only=True)
    class Meta:
        model = Product
        fields = ["id", "name", "description", "price", "stock", "category", "category_name", "created_at"]


class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = "__all__"


class OrderItemSerializer(serializers.ModelSerializer):
    product_name = serializers.CharField(source="product.name", read_only=True)
    class Meta:
        model = OrderItem
        fields = ["id", "product", "product_name", "quantity", "unit_price", "created_at"]


class OrderSerializer(serializers.ModelSerializer):
    customer_name = serializers.CharField(source="customer.name", read_only=True)
    order_items = OrderItemSerializer(many=True, read_only=True)
    class Meta:
        model = Order
        fields = ["id", "customer", "customer_name", "order_date", "total_amount", "status", "order_items", "created_at"]
补充说明
  • 外键删除策略根据通用业务场景设置:商品分类和商品关联用PROTECT避免分类被误删导致商品数据异常,客户和订单关联用CASCADE实现删除客户时同步删除对应订单,可自行调整
  • 序列化器额外添加了关联表的名称字段,满足接口返回常用字段的需求,不需要可自行删除
  • 所有字段的长度、精度、可选属性都可以根据实际业务需求调整

内容的提问来源于stack exchange,提问作者djangodeveloper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:27:03