社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Jeff A • 5 年前 • 1435 次点击  

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

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

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49895
 
1435 次点击  
文章 [ 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)