Django 模型管理器.py 和 models.py

问题描述 投票:0回答:3

考虑到以下情况: 模型.py

from .managers import PersonManager
from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=256)
    last_name = models.CharField(max_length=256)

managers.py

from .models import Person
from django.db import managers

class PersonManager(models.Manager):
    def create(self, person_dict):
        new_person = Person(
            first_name=person_dict['first_name']
            last_name=person_dict['last_name'])
        new_person.save()

如何编写模型管理器以避免循环导入? 它实际上不起作用,我的猜测是我必须在管理器中创建我的对象而不将其引用为类 Person,相反我应该使用更通用的通用 Django 名称。有什么想法吗?

django python-3.x django-models
3个回答
9
投票

这里有几个选项。

首先,你可以在同一个文件中定义模型和管理器; Python 不要求或期望每个类都在自己的文件中。

其次,您实际上不需要将模型导入到管理器中。管理者属于模特,而不是相反;在管理器中,您可以通过

self.model
引用模型类。

最后,如果这就是你的经理所做的一切,那么根本没有理由这么做。管理者已经有了

create
的方法;它需要关键字参数,而不是字典,但这仅意味着您可以使用
Person.objects.create(**person_dict)
来调用它。


0
投票

对于任何想要从同一文件导入不同模型(不是查询集的模型)的人,您可以将导入语句放在需要的方法中。这将防止循环导入。


0
投票
from typing import TYPE_CHECKING, 

if TYPE_CHECKING:
    from .models import YourModel

如果您使用模型来表示类型,则可以使用此构造。但是,如果您正在调用方法或访问属性,则上面的答案已经给出。

© www.soinside.com 2019 - 2024. All rights reserved.