【发布时间】:2018-11-24 13:21:29
【问题描述】:
我有一个要求,我想在 Django 中拥有相同的表。例如 MyTableCurrent 和 MyTableArchive。
除了类/表名和外键引用之外,这些表应该是相同的。
有没有办法基本上维护 MyTableCurrent 上的架构,然后在 MyTableArchive 下,我继承自 MyTableCurrent 的基类,但只覆盖外键字段以匹配相应的存档表?
【问题讨论】:
标签: django django-models
我有一个要求,我想在 Django 中拥有相同的表。例如 MyTableCurrent 和 MyTableArchive。
除了类/表名和外键引用之外,这些表应该是相同的。
有没有办法基本上维护 MyTableCurrent 上的架构,然后在 MyTableArchive 下,我继承自 MyTableCurrent 的基类,但只覆盖外键字段以匹配相应的存档表?
【问题讨论】:
标签: django django-models
我找到了我正在寻找的解决方案。
https://docs.djangoproject.com/en/2.1/topics/db/models/#abstract-base-classes
class ServiceProviderBase(models.Model):
sp_id = models.CharField(max_length=64, primary_key=True)
name = models.CharField(max_length=64, null=True, blank=True)
isEnterprise = models.CharField(max_length=5)
cluster = models.CharField(max_length=64)
created_date = models.DateTimeField(auto_now_add=True)
class Meta:
abstract = True
class ServiceProviderCurrent(ServiceProviderBase):
pass
class ServiceProviderArchive(ServiceProviderBase):
pass
class GroupBase(models.Model):
id = models.AutoField(primary_key=True)
grp_id = models.CharField(max_length=64)
name = models.CharField(max_length=64, null=True, blank=False)
userLimit = models.IntegerField()
organizationType = models.CharField(max_length=64)
created_date = models.DateTimeField(auto_now_add=True)
class Meta:
abstract = True
class GroupCurrent(GroupBase):
organizationId = models.ForeignKey('sandbox.ServiceProviderCurrent', on_delete=models.CASCADE)
class GroupArchive(GroupBase):
organizationId = models.ForeignKey('sandbox.ServiceProviderArchive', on_delete=models.CASCADE)
【讨论】:
您可以创建一个表和从该表继承的其他两个表。示例:
class BaseMedal(models.Model):
field_one = models.ForeignKey(TableName,...)
field_two = models.ForeignKey(AnotherTableName,...)
class ModelOne(BaseModal)
field = models.TextField(...)
class ModelTwo(BaseModel)
field = models.TextField(...)
这样,ModelOne 和 ModelTwo 的外键字段是相同的。
【讨论】:
您可以使用Proxy Model。例如:
class BaseModel(models.Model):
# your common fields
class Current(BaseModel):
class Meta:
proxy=True
def some_current_model_method(self):
# specific method for this class
class Archive(BaseModel):
class Meta:
proxy=True
def some_archive_model_method(self):
# specific method for this class
用法:
archive1 = Archive.objects.create(title="Archive 1")
archive2 = Archive.objects.create(title="Archive 2")
current1 = Current.objects.create(title="Current 1")
current2 = Current.objects.create(title="Current 2")
archives = Archive.objects.all().count() # will print 4
currents = Current.objects.all().count() # will print 4
base = BaseModel.objects.all().count() # print 4
Archive.objects.get(title="Archive 1") # will work
Archive.objects.get(title="Current 1") # will work
Current.objects.get(title="Archive 1") # will work
Current.objects.get(title="Current 1") # will work
BaseModel.objects.get(title="Archive 1") # will work
BaseModel.objects.get(title="Current 1") # will work
BaseModel.objects.create(title="BaseModel")
Archive.objects.get(title="BaseModel") # will work
Current.objects.get(title="BaseModel") # will work
【讨论】: