1

다음은 모델입니다. FilterValue 모델에서 이미 참조되고있는 FilterValue 모델의 Filter 개체에 대한 참조를 피할 필요가 있습니다.자체 모델에 대한 참조가있는 장고 외래 키 limit_choices_to 제약 조건을 정의하는 방법은 무엇입니까?

class Filter(models.Model): 
     name = models.CharField('Name', max_length=255) 

    class FilterValue(models.Model): 
     name = models.CharField('Name', max_length=255) 
     filter = models.ForeignKey(Filter, limit_choices_to=Q(***?***)) 

나는 대신에 가능할 수있는 것을 찾고 있어요?.

+0

필터를 FilterValue로 설정하고 모델을 저장할 때 목록에서 더 이상 보지 않으려 하시니까? 그러한 솔루션의 목적은 무엇입니까? – Tisho

+0

중복 된 항목을 추가하지 마십시오. – Babu

+0

어쩌면 나는 그것을 올바르게 이해할 수 없지만, 이것이 올바른 방법이 아닌 것 같아 ... – Tisho

답변

1

에서 관리자에서이 작업을 수행하는 방법에 대해 쓴, 아이디어는 중복 항목을 추가하는 것을 금지하는 것입니다.

그러나 거기 일을 더 안전한 방법입니다 :

class FilterValue(models.Model): 
    name = models.CharField('Name', max_length=255) 
    filter = models.ForeignKey(Filter) 

    class Meta: 
     unique_together = (("name", "filter"),) 

가 원래의 솔루션은 단지 형태의, 관리자에서 필터의 목록이 표시됩니다,하지만 실제로는 중복을 추가 금지하지 않습니다 프로그래밍 방식으로

1

이렇게하면 안되지만 양식의 일부로 처리 할 수 ​​있습니다. 특히 폼의 __init__ 메서드 중에 관련된 필드의 쿼리 집합을 변경할 수 있습니다.

나는 내가 OP의 발언에서 알 수있는 바와 같이 Filtering querysets in django.contrib.admin forms

0

나는 FilterValueAdmin 편집 전용 관리자에 만들고 FilterAdmin 모델에서 인라인과 동일한을 추가하여 다른 방법으로 그것을했다.

class FilterValueInline(admin.StackedInline): 
    formset = FilterValueInlineFormset 
    model = FilterValue 
    max_num = 1 
    can_delete = False 


class FilterAdmin(admin.ModelAdmin): 
    list_display = ('id', 'name') 
    inlines = [FilterValueInline] 


class FilterValueAdmin(admin.ModelAdmin): 
    """Filter value has to be added via the filter table""" 
    def has_add_permission(self, request): 
     return False 
    def has_delete_permission(self, request, obj=None): 
     return False 
    actions = None 
    list_display = ('id', 'name', 'filter')