我正在将Django与Python 3.7和PyCharm结合使用。我正在关注本教程,以学习如何创建模型并将其保存到数据库https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects中。本教程指的是用于检索对象的管理器,而不是用于设置对象的管理器,因此我对为什么出现以下错误感到困惑
stack.yaml
当我尝试创建和保存对象时。下面是我如何在我的models.py文件中定义对象的方法...
flags:
<pkg>:
debug: false
我确定我确实缺少一些明显的东西,但我不知道它是什么。
编辑:许多人建议使用“ Article.objects.create”方法,但下面是控制台的输出...
Article.objects.create_article(main page, '/path', 'url', 10, 22)
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'Manager' object has no attribute 'create_article'
答案 0 :(得分:1)
定义模型类时,Django会陷入困境,并在“对象”属性下为模型添加默认的Manager。您可以为不同的目的自定义Model 和 Manager。
通常,模型上的方法应处理单个实例,或者概念上应处理数据库中的一行。 Model.save()
,Model.delete()
都作用于单个实例或一行。
管理器上的方法通常应与整个表一起使用,例如filter()
,get()
,aggregate()
,因为这些函数对表执行操作。您还可以在管理器上使用create()
方法,因为它会向表中添加一行。此外,您可以定义自定义管理器并将其分配给模型上的不同属性。例如:
class EngineerManager(Manager):
def get_queryset(self):
return super().get_queryset().filter(employee_type="engineer")
class ManagerManager(Manager):
def get_queryset(self):
return super().get_queryset().filter(employee_type="manager")
class Employee(Model):
employee_type = models.CharField()
engineers = EngineerManager()
managers = ManagerManager()
objects = Manager() # This is always added to your models to list all objects
Employee.engineers.filter() # Will only return engineering employees
Employee.objects.filter() # Will return ALL employees
由于您的问题,Article.objects.create_article(...)
似乎不存在,您可能应该使用Article.objects.create(...)
,因为默认的Manager确实具有create()
方法。
使用Article.objects.create(...)
将新的Article持久化到数据库中并返回它。否则,您可以从技术上使用Article.create(...)
方法来创建Article的内存中实例,但是该实例尚未保存到数据库中,因此请记住,您必须在实例上调用save()
它一直保存到您的数据库中。
https://docs.djangoproject.com/en/2.1/topics/db/models/ https://docs.djangoproject.com/en/2.1/topics/db/managers/
答案 1 :(得分:1)
要在数据库中创建文章,请使用manager的create方法(参数应命名,而不是像示例中那样定位)
Article.objects.create(mainpage=mainpage, path=path, url=url,
votes=votes, comments=comments)
或者您可以初始化类实例,然后将其保存。无论如何,在这里都可以定位或命名参数。
article = Article(mainpage, path, url, votes, comments)
article.save()
您的方法def create(cls, mainpage, path, url, votes, comments):
毫无意义,因为它重复了类的调用(__call__
方法),就像在我的第二个示例中一样。如果要向对象创建添加一些额外的逻辑,则应定义自定义Manager
类并在其中添加方法,然后将模型的objects属性链接到自定义管理器类,例如objects = CustomManager()