2016-03-03 90 views
0

我想使用limit_choices_to來減少使用Inline時的模型的Django管理員的選擇集。ManyToMany上的Django limit_choices_to與Inline相關聯

有趣的是,我爲什麼要限制選擇的原因是爲了表現我想在我的相關模型類的__str__方法使用父模型的屬性,而不是限制的選擇會導致許多令人望而卻步的SQL查詢。

以下工作

class ParentOfA(models.Model): 
    name = models.CharField(max_length=50, null=True) 


class A(models.Model): 
    parent = models.ForeignKey(ParentOfA) 

    def __str__(self): 
     return "%s" % self.parent 


class B(models.Model): 
    a = models.ManyToManyField(A, limit_choices_to={"a__name":'parent name'}) 

如果我沒有在管理形式使用內嵌的B(以下例子in the docs)。

E.g.

@admin.register(B) 
class BAdmin(admin.ModelAdmin): 
    pass 

然而,與內聯limit_choices_to沒有影響:

class BInline(admin.TabularInline): 
    model = B.A.through 

@admin.register(B) 
class BAdmin(admin.ModelAdmin): 
    inline = (BInline,) 

有什麼建議?

+0

你的問題是令人困惑,因爲你正在使用真實姓名的混合物,例如'ScheduleDeviceParameterGroup',並且構成名字,例如'B'。 – Alasdair

+1

@Alasdair固定。有關案件的進一步建議? –

回答

1

我不知道爲什麼limit_choices_to不適用於內聯字段,我遇到同樣的問題。雖然這不應該是必要的,但您可以使用此答案限制內聯字段的查詢集:https://stackoverflow.com/a/4236159/1302095

這是舊問題的答案,所以我不確定新問題中是否有更好的方法Django的版本。我使用1.8.3,它的工作原理,這對我來說很重要!粘貼在這裏以供參考

代碼:

class RoomInline(admin.TabularInline): 
    model = Room 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     field = super(RoomInline, self).formfield_for_foreignkey(db_field, request, **kwargs) 

     if db_field.name == 'inside_room': 
      if request._obj_ is not None: 
       field.queryset = field.queryset.filter(building__exact = request._obj_) 
      else: 
       field.queryset = field.queryset.none() 

     return field 

class BuildingAdmin(admin.ModelAdmin): 
    inlines = (RoomInline,) 

    def get_form(self, request, obj=None, **kwargs): 
     # just save obj reference for future processing in Inline 
     request._obj_ = obj 
     return super(BuildingAdmin, self).get_form(request, obj, **kwargs)