2014-07-08 2 views
0

외래 키와 함께 Django 1.4.13을 사용하고 있습니다. 우리는 ContentUser 클래스에 외래 키가있는 클래스로부터 상속받은 클래스 인 BusinessUnit을 가지고 있습니다. 우리는 클래스 ContentSet에서 다음과 같은 기능을 가지고 :외부 키 역방향 - Django의 버그?

def business_units_default_content_set_count(self): 
    """ 
    Returns the number of business units linked to this content set as default. 
    """ 
    return len(set([bu.pk for bu in list(self.businessunit_set.all())])) 

문제는 우리가 기본 키가없는 ContentSet를 작성하는 경우 (이 함수는 0이 아닌 정수를 반환 (우리가 디스크에 저장하지 않음)이다 예를 들어 30). 내가 할 수있는 기능을 변경하여이 문제 해결 :

def business_units_default_content_set_count(self): 
    """ 
    Returns the number of business units linked to this content set as default. 
    """ 
    if (self.pk): 
     return len(set([bu.pk for bu in list(self.businessunit_set.all())])) 
    else: 
     return 0 

을 왜 우리는 전혀 self.pk을 확인해야합니까? Django 1.4.13의 버그입니까? 그리고 만약 그렇다면 장고의 다른 버전에서 수정 되었습니까?

+0

에 연결되지 않은 일부 BusinessUnits을 가지고 있기 때문에

은 아마 문제입니다. 그것이 불가능하기 때문에 (') (계산 queryset에 중복 항목이 있음). –

+0

@DanielRoseman 예, 동의합니다. 우리는'len (list (self.business_units.all()) + list (self.businessunit_set.all())))))')'에서 bu에 대한 bu.pk를 반환하는 또 다른 함수를 가지고 있습니다.이 함수는 'list (self.business_units.all()) '가없는 다른 함수. – Uri

답변

1

역방향 관계를 사용하여 모든 사업 단위를 가져 오려고 할 때 django가 데이터베이스에 연결하면서 상위 항목으로 모든 하위 개체를 필터링합니다. 당신은 모든 기능이 반환 self.businessunit_set.all()`로 감소 될 수있는 ContentSet

+0

예, 콘텐츠 세트에 연결되지 않은 비즈니스 단위가 있다고 생각합니다. 그러나 기본 키가없는 콘텐츠 세트와 관련해서는 안됩니다. – Uri

+0

BusinessUnit 인스턴스를 저장하지 않은 경우 해당 pk/id는 없음/널 (null)이므로 필터링 할 경우 : Child.objects.filter (parent = parent_obj)는 Child.objects.filter (parent_id = None) 또는 SQL parent_id = null ... 그럼, 분명히 부모없이 모든 자식 개체를 얻을 것이다. 이 하위 목록을 표시하지 않으려면 .all() 다음에 .exclude (parent = None)을 추가하십시오. 자식 부모 ForeignKey 특성 – Darwin

+0

나는 장고에서 버그라고 생각합니다. 왜냐하면'self.businessunit_set self.pk가 None이면 .all()'은 비어 있어야합니다. – Uri