【问题标题】:How do I import an object into its own manager?如何将对象导入到它自己的管理器中?
【发布时间】:2017-06-30 16:15:56
【问题描述】:

我意识到我的逻辑有缺陷并导致循环导入。

这是我想要完成的:

ma​​nagers.py(与 models.py 分开)

class TicketManager(models.Manager):
    def create_in_atom(self, ticket):
        if type(ticket) is not Ticket:
            raise Exception('Not a Ticket object.')

这会产生这个错误:

NameError:未定义全局名称“票证”

然后我尝试导入它:

from models import Ticket

产生:

ImportError: 无法导入名称票证


如何检查传递给 TicketManager 函数的参数是否属于 TickerManager 所属的“Ticket”类型?

【问题讨论】:

  • from .models import Ticket 怎么样?
  • @Exprator ImportError: cannot import name Ticket
  • 您有型号名称 TIcket 吗?和models.py和manager.py在同一个目录吗?
  • @Exprator 解决了!

标签: python django


【解决方案1】:

可以动态获取模型,而不是导入:

from django.apps import AppConfig

class TicketManager(models.Manager):
    def create_in_atom(self, ticket):
        if type(ticket) is not AppConfig.get_model('Ticket'):
            raise Exception('Not a Ticket object.')

【讨论】:

    【解决方案2】:
    class TicketManager(models.Manager):
    def create_in_atom(self, ticket):
        if type(ticket) is not self.model:
            raise Exception('Not a Ticket object.')
    

    答案是“self.model”。

    因为您将 manager.py 导入到 models.py 中,所以您已经可以访问该模型。

    Read more here.

    【讨论】:

    • 这可能是您的情况的正确解决方案,但与导入无关。另外,如果我将 TicketManager() 放在模型 Concert 上,并提供一个 Ticket 实例,则会引发异常,因为 ticket 不是 Concert 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多