如何过滤ManyToMany对象的父母属性?

时间:2020-07-23 20:24:10

标签: python django many-to-many

我是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中进行搜索,但是我找不到答案,因此不胜感激。

1 个答案:

答案 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