模型中的django循环导入
django circular import in models
我知道我在这里有一个循环导入,但其中一个用于定义一些外键字段,另一个仅用于另一个模型中的 属性。
型号:
receipts/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)
employees/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
我知道我在这里有一个循环导入,但其中一个用于定义一些外键字段,另一个仅用于另一个模型中的 属性。
型号:
receipts/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)
employees/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