在Django中创建和保存对象时需要经理吗?

时间:2019-01-08 23:04:41

标签: python django python-3.x model

我正在将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'

2 个答案:

答案 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()