Django属性错误:对象没有属性' __ state'从Class中删除__init__

时间:2018-02-10 14:31:53

标签: python django

我正在尝试为Django应用程序" webshop"创建一个模型,而且我很难理解我的问题源于什么。

我在这里留下了原始代码,因为我所做的更改有点大,但请告诉我,如果看起来很混乱,我会删除之前的代码和文本或以某种方式修改它。跳到"编辑"看看我目前的进展在哪里

我拥有的models.py是:

来自django.db导入模型

class Product(models.Model):

    def __init__(self, title, quantity, description, image_url=""):
        title = models.CharField(max_length=255)

        self.quantity = quantity
        self.title = title
        self.description = description
        self.image_url = image_url

    def sell(self):
        self.quantity = self.quantity - 1

我希望能用它做的事情是用以下内容初始化它:

toy1 = Product(title="Bear plush", description="Fluffy bear plush toy", quantity=10)

我可以用

来调用它

print(toy1.quantity) print(toy1.title) toy1.sell() 等等很好,但是toy1.save()会返回错误

AttributeError: 'Product' object has no attribute '_state'

在使用Google搜索问题时,我发现不建议在此处使用 init 这一事实,但https://docs.djangoproject.com/en/1.11/ref/models/instances/#creating-objects中提供的替代方案 两者都使用一个逻辑,其中类函数的第一次调用与初始调用不同。

如果我面临的问题是由于依赖于__init__,我怎样才能摆脱它,同时仍然可以使用toy1 = Product(title="Bear plush", description="Fluffy bear plush toy", quantity=10)初始化对象 或者我的问题是完全不同的?

编辑:

所以经过一些挖掘和尝试之后,我的models.py现在处于这个阶段:

来自django.db导入模型

class Product(models.Model):

    title = models.CharField(max_length=255)
    description = models.CharField()
    quantity = models.IntegerField(default=0)
    image_url = models.CharField(default="")

    @classmethod
    def sell(cls, quantity):
        quantity = cls(quantity=quantity)
        quantity = quantity - 1
        return quantity

之前的命令仍然有效,而且我不再在类功能中使用 init ,所以这是一个开始!我尝试运行toy1.save()时出现了不同类型的错误:

sqlite3.OperationalError: table webshop_product has no column named title


The above exception was the direct cause of the following exception:


django.db.utils.OperationalError: table webshop_product has no column named title

我试图找到桌子在我的网店中的位置,但是不管桌子应该哪个"标题"都不应该发生错误。在其中

1 个答案:

答案 0 :(得分:1)

我认为您尝试创建的模型应该如下所示:

class Product(models.Model):
    title = models.CharField(max_length=255)
    quantity = models.IntegerField()
    description = models.TextField()
    image_url = models.CharField(max_length=255, validators=[URLValidator()])

    def sell(self):
        self.quantity = self.quantity - 1
        self.save()

Django负责实例化,所以你不需要__init__位。