Py学习  »  Django

Django DB Model,创建两个相同的表,一个继承另一个

Jeff A • 5 年前 • 1594 次点击  

我有一个要求,我想在Django有相同的表。例如MyTableCurrent和MyTableArchive。

除了类/表名和外键引用之外,表应该相同。

有没有办法基本上维护MyTableCurrent上的模式,然后在MyTableArchive下,我继承MyTableCurrent的基类,但只重写外键字段以匹配相应的归档表?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49895
 
1594 次点击  
文章 [ 3 ]  |  最新文章 5 年前
ruddra
Reply   •   1 楼
ruddra    6 年前

你可以用 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
kamilyrb
Reply   •   2 楼
kamilyrb    6 年前

您可以创建一个表和从该表继承的其他两个表。示例:

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(...)

这样,模型一和模型二的foreignkey字段是相同的。

Jeff A
Reply   •   3 楼
Jeff A    6 年前

我找到了我想要的解决方案。

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)