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

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
相关产品推荐
相关产品推荐

