【问题标题】:Class Based View - Fields aren't created in database (python Inherits\django cbv)基于类的视图 - 未在数据库中创建字段 (python Inherits\django cbv)
【发布时间】:2022-01-22 20:30:55
【问题描述】:

我正在尝试按照本教程创建模型继承:https://www.digitalocean.com/community/tutorials/understanding-class-inheritance-in-python-3

一切正常。可以访问子级中的 FirstName 属性并在视图中显示,但是当我运行 makemigration/migrate 时,不会在数据库的表中创建继承字段。 (核心鲨鱼 / 核心鳟鱼)

我做错了什么?是否可以使用python继承和CBV通过makemigration/migrate在数据库中创建字段?

模型.py

class Fish(models.Model):
    def __init__(self, first_name, last_name="Fish"):
        self.first_name = first_name
        self.last_name = last_name

    def swim(self):
        print("The fish is swimming.")

    def swim_backwards(self):
        print("The fish can swim backwards.")

    class Meta:
        verbose_name = 'Fish'
        abstract = True     
        
    def __str__(self):
        return self.first_name


class Shark(Fish):
    def __init__(self, first_name, last_name="Shark", skeleton="cartilage", eyelids=True):
        self.first_name = first_name
        self.last_name = last_name
        self.skeleton = skeleton
        self.eyelids = eyelids

    def swim_backwards(self):
        print("The shark cannot swim backwards, but can sink backwards.")


class Trout(Fish):
    def __init__(self, water ='', price = 0):
        self.water = water
        self.price = price
        super().__init__(self)

    class Meta:
        verbose_name = 'Trout'

view.py

class IndexView(TemplateView):
    template_name = 'index.html'

    def get_context_data(self, **kwargs):

        context = super(IndexView, self).get_context_data(**kwargs)      
        sammy = Shark("Sammy")
        terry = Trout()
        terry.first_name = "Terry"

        context['sammy'] = sammy
        context['terry'] = terry
 
        return context

index.html

...
<body style="color:red">
    <h1>Fish Name: {{sammy.first_name}}</h1>
    <h1>Fish Name: {{terry.first_name}}</h1>
</body>
...

[2

project git

【问题讨论】:

    标签: python python-3.x django database-migration django-class-based-views


    【解决方案1】:

    根据Django Documentation for Models,你需要将你的数据库字段定义为Class属性。

    I.o.w:

    class Fish (models.Model):
        
        first_name = models.CharField(max_length=64)
        last_name = models.CharField(max_length=64)
        
        def __init__(self, first_name, last_name="Fish"):
            self.first_name = first_name
            self.last_name  = last_name
    

    这样做将允许在您运行迁移时在数据库中创建它们。

    【讨论】:

      猜你喜欢
      • 2016-07-28
      • 2012-04-10
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2014-06-23
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多