我是Django的新手,今天遇到了问题
我有两个模型,tesseract_cmd = 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract\\tesseract.exe'
pytesseract.pytesseract.tesseract_cmd = tesseract_cmd
print(pytesseract.image_to_string(Image.open('test.png')))
和Program
。
models.py
Member
每个程序都有一个from django.db import models
from django.db.models import Sum
class Program(models.Model):
name = models.CharField(max_length=200)
fee = models.IntegerField(default=10) # Arbitrary Property
class Member(models.Model):
programs = models.ManyToManyField(Program, related_name='members')
name = models.CharField(max_length=200)
# I tried this but it gives me all of the sum of all the programs' fees :
# fees_for_member = models.IntegerField(default=Program.objects.prefetch_related('members').aggregate(Sum('fee'))['fee__sum'])
# This results in an error:
# fees_for_member = programs.aggregate(Sum('fee'))['fee__sum']
,而fee
有一个名为Member
或仅fees_for_member
的IntegerField,其默认值是所有fees
的和。 Program fees
已注册。
我的问题是,如何过滤Member
所在的Programs
?
我已经尝试过member
,但它返回了所有计划费用的总和。
我也尝试过Program.objects.prefetch_related('members').aggregate(Sum('fee'))['fee__sum'])
,但这给了我这个错误:
programs.aggregate(Sum('fee'))['fee_sum']
对此我该怎么办?我知道我想念一些东西,但是我不确定那是什么。我花了数小时在Django文档和SO中进行搜索,但是我找不到答案,因此不胜感激。
答案 0 :(得分:1)
您应该为fee_for_member定义一个属性,而不是一个字段,因为必须动态计算该字段:
class Member(models.Model):
programs = models.ManyToManyField(Program, related_name='members')
name = models.CharField(max_length=200)
@property
def fees_for_member(self):
return self.programs.aggregate(models.Sum('fee'))['fee__sum']
这应该有效。
解决方案2:
如果Program.fee也是属性,并且属性是python代码(不是数据库中的值),则不能使用数据库级操作。一个等效的解决方案是:
class Member(models.Model):
programs = models.ManyToManyField(Program, related_name='members')
name = models.CharField(max_length=200)
@property
def fees_for_member(self):
return sum([p.fee for p in self.programs.all()])
有关此的一些文档: https://docs.djangoproject.com/en/3.0/topics/db/models/#model-methods