假设我有3个班级,A,B,C。
class A(models.Model):
comment = models.CharField(max_length=600, default="None")
rating = models.IntegerField(default=1, choices=CHOICES, name='rating')
date = models.CharField(max_length=50, default='nonee')
class B(models.Model):
Aname = models.ForeignKey('A', related_name='AB')
classC = models.ForeignKey('C', related_name='BC')
class C(models.Model)
#some info
def average_rating(self):
return self.?????.all().aggregate(Avg('rating')).values()[0]
我如何从我的self
作为对象的视图开始,一直回到A类,以便我可以聚合rating
个数字。如果我理解正确的话,B类的重点只是成为一个显示关系的对象?我已经能够在两个班级之间进行,但当第三个“关系”一个在那里时,我似乎无法让它工作。
答案 0 :(得分:0)
当需要在记录集(查询集)而不是单个记录(模型)上执行操作时,您应该考虑custom managers。
添加额外的Manager方法是向模型添加“表级”功能的首选方法。 (对于“行级”功能 - 即,作用于模型对象的单个实例的函数 - 使用Model方法,而不是自定义Manager方法。)
答案 1 :(得分:0)
你根本不需要B级。你需要的是A和C之间的ManyToManyField;这将在幕后创建一个类似于B的表,但除非你真的需要在该表上添加字段,否则最好不要明确定义它。
在C上添加M2M后,您的average_rating
方法可以直接使用它:
class C(models.Model)
model_a_s = models.ManyToManyField('A')
def average_rating(self):
return self.model_a_s.all().aggregate(Avg('rating')).values()[0]
(注意,你的问题标题有点令人困惑;这里根本没有涉及任何观点。)