python - 模型中的 Django 循环导入

标签 python django importerror

我知道我在这里有一个循环导入,但其中一个用于定义一些外键字段,另一个仅用于另一个模型中的属性。

型号:

收据/models.py

from django.db import models
from employees.models import Employee

class Receipt(models.Model):
    Supervisor = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='receipt_supervisor')
    Employee = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='receipt_employee')
    amount = models.DecimalField(max_digits=6, decimal_places=2)

员工/models.py

from django.db import models
from receipts.models import Receipt

class Employee(models.Model):
    number = models.CharField(max_length=50, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    @property
    def receipt_sum(self):
        receipts = Receipt.objects.filter(Employee=self.pk)
        sum = 0
        for receipt in receipts:
            sum += receipt.amount
        return sum

我收到此错误:

无法从部分初始化的模块“employees.models”导入名称“Employee”(很可能是由于循环导入)

有没有办法解决这个问题,以便我可以在 Employee 属性中进行收据查询?还是我需要在别处进行此计算?

谢谢!

最佳答案

Is there a way I can get around this so that I can do the receipt query in the Employee property?

可以,可以在方法中导入模块:

from django.db import models

class Employee(models.Model):
    number = models.CharField(max_length=50, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    @property
    def receipt_sum(self):
        from receipts.models import <b>Receipt</b>
        receipts = Receipt.objects.filter(Employee=self.pk)
        sum = 0
        for receipt in receipts:
            sum += receipt.amount
        return sum

其实根本不需要导入Receipt,可以利用receipt_employee关系来访问相关的Receipt对象, 你可以使用 .aggregate(…) [Django-doc]总结数据库端的元素,这可能更有效:

from django.db import models
from django.db.models import <b>Sum</b>

class Employee(models.Model):
    number = models.CharField(max_length=50, unique=True)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    @property
    def receipt_sum(self):
        return self.<b>receipt_employee</b>.aggregate(
            <b>total=Sum('amount')</b>
        )['total'] or 0

关于python - 模型中的 Django 循环导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65499015/

相关文章:

python - 在django中的渲染函数中访问args

python - 用 FastAPI TestClient 测试返回 422 状态码

python - Redis PUB/SUB 可以支持多少个 channel ?

python - 如何更改登录 Twitter 用户的 Django Social 身份验证密码

python - 即使我安装了,也没有名为 'Kivy' 的模块

python - 从具有不同顶级文件夹名称的 Django 项目导入

python - 混淆将 c++ 库包装到 python

python - str.encode(编码 ='utf-8' ,错误 ='strict' )是否有可能引发 UnicodeError?

python - django和python的manage.py runserver执行错误

python - Windows Docker - 在 python 中安装 Spacy 语言模型返回 ImportError : DLL load failed: The specified module could not be found