我用django开发电子礼薄的后端,from django.db import models from django.contrib.auth.models import User class Event(models.Model): """ 礼簿场景表 - user: 关联的用户 - name: 场景名称(如“张三&李四婚礼”) - date: 场景日期 - total_gifts: 礼金总额 - guest_count: 宾客人数 - created_at: 创建时间 """ user = models.ForeignKey(User, on_delete=models.CASCADE) name = models.CharField(max_length=255) date = models.DateField() total_gifts = models.FloatField(default=0) guest_count = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name class Guest(models.Model): """ 宾客表 - event: 关联的场景 - name: 宾客姓名 - relationship: 与新人关系(如“朋友”、“亲戚”) - phone: 联系方式(可选) - gift_amount: 礼金金额 - created_at: 创建时间 """ event = models.ForeignKey(Event, on_delete=models.CASCADE) name = models.CharField(max_length=255) relationship = models.CharField(max_length=255) phone = models.CharField(max_length=20, blank=True, null=True) gift_amount = models.FloatField(default=0) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.name class Gift(models.Model): """ 礼金记录表 - event: 关联的场景 - guest: 关联的宾客 - amount: 礼金金额 - note: 备注(可选) - created_at: 创建时间 """ event = models.ForeignKey(Event, on_delete=models.CASCADE) guest = models.ForeignKey(Guest, on_delete=models.CASCADE) amount = models.FloatField() note = models.TextField(blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"{self.guest.name} - {self.amount}" class GiftGiven(models.Model): """ 送礼记录表 - user: 关联的用户 - receiver: 收礼人姓名 - amount: 送礼金额 - date: 送礼日期 - relationship: 与收礼人关系(如“朋友”) - note: 备注(可选) - created_at: 创建时间 """ user = models.ForeignKey(User, on_delete=models.CASCADE) receiver = models.CharField(max_length=
时间: 2025-03-07 17:12:04 浏览: 95
### 设计电子礼簿应用的Django模型
为了构建一个功能完整的电子礼簿应用,可以设计四个主要的模型:`Event`、`Guest`、`Gift` 和 `GiftGiven`。这些模型之间的关系能够有效地表示事件、嘉宾以及礼物赠送的情况。
#### Event 模型
该模型用于存储活动的信息,比如婚礼或生日派对等场合的具体详情。
```python
from django.db import models
class Event(models.Model):
name = models.CharField(max_length=255, verbose_name="活动名称")
date = models.DateField(verbose_name="日期")
location = models.TextField(blank=True, null=True, verbose_name="地点")
class Meta:
verbose_name = '活动'
verbose_name_plural = '活动列表'
def __str__(self):
return self.name # 显示活动名称作为字符串表达形式[^1]
```
#### Guest 模型
此模型用来记录参加者的个人信息及其与特定活动的关系。
```python
class Guest(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='guests', verbose_name="所属活动")
first_name = models.CharField(max_length=100, verbose_name="名字")
last_name = models.CharField(max_length=100, verbose_name="姓氏")
email = models.EmailField(unique=True, blank=False, verbose_name="电子邮件地址")
class Meta:
verbose_name = '来宾'
verbose_name_plural = '来宾名单'
def __str__(self):
return f"{self.first_name} {self.last_name}" # 定制显示行为以便于识别具体的客人实例
```
#### Gift 模型
礼品目录由这个模型管理,它保存可能收到的各种类型的礼物信息。
```python
class Gift(models.Model):
description = models.CharField(max_length=255, verbose_name="描述")
class Meta:
abstract = True # 设置为抽象基类,不创建数据表[^2]
def __str__(self):
return self.description # 提供简洁明了的文字表述方式给每一个礼物对象
```
由于希望某些情况下仅使用礼物的概念而不实际存入数据库中,因此将 `Gift` 类设置成了抽象基类。这意味着任何继承自 `Gift` 的子类都会获得其字段属性但是本身并不会被映射到一张独立的数据表上。
#### GiftGiven 模型
当某位宾客确认送出一份具体物品时,则会在本模型内新增一条记录关联起相应的 `Guest` 及所选的 `Gift`.
```python
class ConcreteGift(Gift): # 继承自抽象类Gift
price = models.DecimalField(decimal_places=2,max_digits=8,default=0.00)
class Meta:
db_table = 'concrete_gift' # 自定义表名
verbose_name = '具体礼物'
verbose_name_plural = '具体礼物清单'
class GiftGiven(models.Model):
guest = models.OneToOneField(Guest, on_delete=models.CASCADE, primary_key=True, verbose_name="送礼者")
gift = models.ForeignKey(ConcreteGift, on_delete=models.SET_NULL, null=True, verbose_name="已赠予的礼物")
class Meta:
verbose_name = '已收礼物'
verbose_name_plural = '已收礼物统计'
def __str__(self):
return f"来自{self.guest}'s 礼物: {self.gift}" # 结合两个外键的内容形成有意义的字符串输出
```
上述代码片段展示了如何利用 Django ORM 来实现一个简单的电子礼簿系统的后端架构。通过这种方式不仅可以轻松处理复杂的业务逻辑而且还能享受框架带来的诸多便利之处,例如自动化的 SQL 查询生成功能等等。
阅读全文
相关推荐



















