是否应在Django的Activation模型中使用GenericKey关联Package实例?
关于Django Activation模型是否使用GenericKey的分析
结论:必须用GenericKey,你的业务场景明确要求关联到具体的PackageA/PackageB实例,现有模型的设计满足不了这个需求。
核心原因
当前Activation里的package字段只是关联到抽象的Package类型(记录套餐名称、最大激活数),但没法绑定到每次激活生成的PackageA/PackageB具体实例。而业务要求每次激活都要创建对应套餐的实例并关联,GenericKey正好解决这个「跨模型关联具体实例」的问题。
具体实现方案
给Activation模型加上通用关联字段,代码示例如下:
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey from django.db import models class Activation(models.Model): subscription = models.ForeignKey("Subscription", on_delete=models.CASCADE) package = models.ForeignKey("Package", on_delete=models.CASCADE) created = models.DateTimeField(auto_now_add=True) # 建议加上自动生成创建时间的配置 # 新增通用关联字段,绑定具体的PackageA/PackageB实例 content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() package_instance = GenericForeignKey('content_type', 'object_id')
业务逻辑配合
- 创建激活记录时,先实例化对应的PackageA/PackageB(比如用户激活EmailAccount就新建PackageA实例)
- 把Activation的
package字段指向对应的Package类型(比如name为"EmailAccount"的Package记录) - 再将
package_instance指向刚创建的PackageA实例
额外优势
如果以后要加PackageC这类新套餐,不需要修改Activation的模型结构,直接新增PackageC模型就行,扩展性很强。
内容的提问来源于stack exchange,提问作者Dail
相关产品推荐
相关产品推荐

