外键关系

时间:2016-03-22 06:34:32

标签: python django foreign-keys

假设我有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类的重点只是成为一个显示关系的对象?我已经能够在两个班级之间进行,但当第三个“关系”一个在那里时,我似乎无法让它工作。

2 个答案:

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

(注意,你的问题标题有点令人困惑;这里根本没有涉及任何观点。)