【问题标题】:Django adding related object to instance of a parentDjango将相关对象添加到父实例
【发布时间】:2019-08-08 16:20:35
【问题描述】:

RoR 难民,在这里学习 Django。 我有一个包含相关模型、项目和工作流的应用程序。我需要创建与项目相关的新工作流对象(项目可以有许多工作流)。我有这个工作正常的逻辑和关系,但是当我尝试在 Project 类中创建一个方法以将工作流添加到 Project 实例并提供默认值时,我无法让它工作。我有这个功能,但是得到一个属性错误'Manager'对象没有属性'add'。当我研究经理时,我找不到涉及添加到模型的函数的参考资料,只涉及限制查询集。我怀疑我的方法不是以 Django 方式做事。

编写了类和函数,遇到了错误,研究了这些,没有发现任何有用的东西。

class Project(models.Model):
    STATUS_CHOICES = (
        ('NS', 'Not Started'),
        ('IP', 'In Process'),
        ('PR', 'Pending Review'),
        ('CP', 'Complete'),
    )
    project_id = models.AutoField(primary_key=True)
    client_id = models.ForeignKey('clients.Client', on_delete=models.CASCADE)
    name = models.CharField(max_length=255, blank=False, null=False)
    description = models.CharField(max_length=255, blank=True)
    status = models.CharField(max_length=2, choices=STATUS_CHOICES)

    def __str__(self):
        # Return the name of the Project.
        return self.name

    @classmethod
    def add_workstream(self, ws_name='New Workstream', ws_desc='TBD'):
        """Add a workstream.

        Include optional arguments for name, description and status.
        """
        from workstreams.models import Workstream
        new_ws = Workstream(project_id=self.project_id,
                            name=ws_name,
                            description=ws_desc)
        new_ws.save()

# Complete workstreams/models.py

from django.db import models
import tasks
import artifacts


class Workstream(models.Model):
    STATUS_CHOICES = (
        ('NS', 'Not Started'),
        ('IP', 'In Process'),
        ('PR', 'Pending Review'),
        ('CP', 'Complete'),
    )
    workstream_id = models.AutoField(primary_key=True)
    project_id = models.ForeignKey('projects.Project',
                                   on_delete=models.CASCADE)
    name = models.CharField(max_length=255, blank=False, null=False)
    description = models.CharField(max_length=255, blank=True)
    status = models.CharField(max_length=2, choices=STATUS_CHOICES)

    def __str__(self):
        return self.name

在 Django 控制台中:

>>> test=Project.objects.get(name='Auditron')
>>> test.add_workstream()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/srummel/DEV/auditron/auditron/projects/models.py", line 28, in add_workstream
    from workstreams.models import Workstream
AttributeError: 'Manager' object has no attribute 'add'
>>> 

我希望创建一个链接到我的项目的新工作流实例,并填充默认值。 我知道问题出在我的经理身上——我在问我的方法是否正确,如果是,是否有人有任何例子说明经理为相关类实现“添加”功能是什么。我的后脑告诉我我犯了一个基本的架构错误,但不确定是什么。感谢您的帮助。

【问题讨论】:

  • 此错误并非来自您发布的任何代码。你在哪里打电话add
  • 抱歉,函数是'add_workstream'。
  • 不,我看到了,但是该方法的代码中没有发生该错误。这似乎是由于导入 workstreams.models 而发生的;您应该显示您在该文件中的哪个位置调用.add
  • 错误出现在 Django 控制台中 - 我创建了一个名为“test”的项目对象,然后调用了“test.add_workstream()”并得到了 AttributeError。
  • 再一次,请显示完整的 workstreams/models.py 文件,包括它调用.add的地方。

标签: django django-models


【解决方案1】:

我添加这个是因为解决方案既不直观,也与我发布的代码完全无关。在 Django 中使用交互式 python 解释器时,不能只重新导入类,必须关闭解释器并重新启动它。我多次尝试添加简单的占位符方法来解决问题所在的问题,并且我得到了所有内容的 AttributeErrors。

解决办法是: 在 python shell 提示符下: 类型:退出() 类型:python manage.py shell 重新运行代码,它就可以工作了......

我感谢那些花时间阅读和回复的人。

【讨论】:

    【解决方案2】:

    在创建 Workstream 实例时,您的“add_workstream”函数需要重构如下:

    @staticmethod
    def add_workstream(self, ws_name='New Workstream', ws_desc='TBD'):
        new_ws = Workstream.objects.create(project_id=self.project_id, 
                                           name=ws_name,
                                           description=ws_desc)
    
    1. 它必须是“static_method”而不是“class_method”
    2. 不需要 new_ws.save()
    3. 在类名后添加“.objects.create”

    【讨论】:

    • 这些都不是必需的,也不会导致操作错误。
    • 也许答案不够清楚。主要问题是类名后没有“.objects.create”,如 sn-p 所示。但是,另外两点是代码中的增强。
    • 但这也不是真的。通过直接实例化它然后保存它来创建模型项是完全有效的。
    • 我尝试了这个解决方案(谢谢顺便说一句)并得到了同样的错误。管理器中存在问题,但不确定修复会是什么样子。
    猜你喜欢
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多