2016-11-23 54 views
0

我希望我能得到你的建議。如何通過反向關係獲取多對多密鑰的計數?

如果我有一個帶有多對多關係的披薩模型,我可以很容易地得到匹薩上的配料數量。

# models.py 
class Pizza(models.Model): 
    toppings = models.ManyToManyField(Topping) 

class Topping(models.Model): 
    name = models.CharField(max_length=255, null=True, blank=True) 

# admin.py 
@admin.register(Pizza) 
class PizzaAdmin(admin.ModelAdmin): 
    list_display = ['topping_count'] 

    def topping_count(self, pizza): 
     return pizza.toppings.count() 

但是,如果我將多對多前向關係移至Topping,則這一切都會中斷。

# models.py 
class Pizza(models.Model): 
    pass 

class Topping(models.Model): 
    pizzas = models.ManyToManyField(Pizza) 

如何更新PizzaAdmin中的topping_count,以便通過反向關係獲得配料計數?

謝謝。

回答

2

反向關係,採用小寫的型號名稱+ _set

@admin.register(Pizza) 
class PizzaAdmin(admin.ModelAdmin): 
    list_display = ['topping_count'] 

    def topping_count(self, pizza): 
     return pizza.topping_set.count() 

或者,您可以保留當前管理員密碼和更改相關的名稱:

class Topping(models.Model): 
    pizzas = models.ManyToManyField(Pizza, related_name='toppings') 
1

獲取反向的計數關係爲pizza.topping_set.count()

1

您對澆頭進行計數的方式效率低下,因爲它會爲每個澆頭執行單獨的數據庫查詢。我會建議作出的annotate使用:

@admin.register(Pizza) 
class PizzaAdmin(admin.ModelAdmin): 
    list_display = ['topping_count'] 

    def get_queryset(self, request): 
     qs = super(PizzaAdmin, self).get_queryset(request) 
     return qs.annotate(topping_count=Count('topping_set'))    

    def topping_count(self, pizza): 
     return pizza.topping_count 

說明:annotate將設置topping_count在管理各Pizza。然後你的PizzaAdmin.topping_count將從實例中檢索topping_count的值。

這樣它就應該觸摸你的數據庫一次無比的比薩餅數量。

相關問題