【问题标题】:Django Migration: prevent base model creation after abstract inheritanceDjango Migration:防止抽象继承后创建基本模型
【发布时间】:2017-12-15 23:44:03
【问题描述】:

我正在创建一个BaseModel 并在Channel 中继承它。这个BaseModel 在执行save() 时会有更多的逻辑。我在完成迁移并生成表时遇到问题。

我的api_channel 表是使用basemodel_ptr_id 引用BaseModel 表创建的。

但是,我正在寻找的是将BaseModel 中的所有字段都继承到Channel 模型中。我的数据库中也不需要basemodel 表。

我已经通过官方Django Doc

请帮忙。

BaseModel.py

from django.db import models
from django.utils import timezone


class BaseModel(models.Model):
    created_on = models.DateTimeField(editable=False)
    updated_on = models.DateTimeField()

    # # To make the BaseModel abstract
    class Meta:
        abstract = True

    def __init__(self, *args, **kwargs):
        self._meta.db_table = self.__class_.__name__.lower()
        super(BaseModel, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        ''' On save, update_at timestamp '''
        if not self.id:
            self.created_on = timezone.now()
        self.updated_on  = timezone.now()
        return super(User, self).save(*args, **kwargs)

Channel.py

from django.db import models
from api.models import base


class Channel(base.BaseModel):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=1000)

【问题讨论】:

  • Meta 类中设置proxy = True 而不是abstract = True 有什么原因吗?
  • @Railslide 我的错……在abstract 失败后,我尝试了所有其他模型继承。这就是proxy 的来源。

标签: python django django-1.8 python-3.2


【解决方案1】:
class BaseModel(models.Model):
    created_on = models.DateTimeField(editable=False)
    updated_on = models.DateTimeField()

    # # To make the BaseModel abstract
    class Meta:
        abstract = True

只要用这个就可以解决上述问题

【讨论】:

    猜你喜欢
    • 2013-10-21
    • 2018-03-07
    • 2013-12-22
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2011-03-11
    相关资源
    最近更新 更多