2016-03-22 65 views
0

可以說我有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

當需要在記錄集(queryset)的基礎上而不是單個記錄(模型)上執行操作時,則應考慮custom managers

添加額外的管理器方法是向模型添加「表級」功能的首選方式。 (對於「行級」功能 - 即作用於模型對象的單個實例的功能 - 使用模型方法,而不是自定義管理器方法。)

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] 

(請注意,你的問題的標題是有點混亂,有沒有在這裏所有參與意見)

+0

我不小心把標題從其他地方留在那裏謝謝。我將在類B中添加其他字段。然後我將有另一個類D(以及其他一些類),它們將使用類A的所有基礎知識,然後我希望將其他字段添加到類A中。我想我只想知道如何使用屬於另一個類的一部分的類。我想我應該研究一下子課程? – ratrace123