2012-03-09 5 views
1

필터 및 m2m 관계 및 request.LANGUAGE_CODE에 문제가 있습니다.장고 - 필터 manytomany 입력란 - request.LANGUAGE_CODE

보기에서 첫 번째 예에서 request.LANGUAGE_CODE를 사용하는 경우 쿼리는 사용 가능한 각 언어에 대해 가능한 모든 항목을 반환합니다.

두 번째 모델에서는 모든 것이 완벽하게 작동합니다.

예 - 작동하지 :

모델 :

class Publisher(models.Model): 
    publication = models.ManyToManyField('Translation', related_name="") 

보기 :

pub = Publisher.objects.filter(publication__language=request.LANGUAGE_CODE) 

예 - 작업 :

모델 :

class Publisher(models.Model): 
    title = models.CharField(max_length=256, verbose_name="Tytuł", blank=True, null=True) 
    text = models.TextField(verbose_name="Treść", blank=True, null=True) 
    language = models.CharField(max_length=8, choices=settings.LANGUAGES, default=settings.LANGUAGES[1]) 

보기 :

pub = Publisher.objects.filter(language=request.LANGUAGE_CODE) 

어떻게 그 일 방법은 수정하거나 문제를 방지하려면 무엇입니까?

답변

0

language 특성은 첫 번째 예에서는 번역 개체의 일부이고 두 번째 예제에서는 Publisher의 일부입니다. 또한 첫 번째 게시자는 독자적인 텍스트가 없지만 텍스트를 보유하는 번역 개체에 대한 M2M을 참조합니다.

첫 번째 예에서는 번역이 아닌 발행인을 선택하도록 요청하고 있습니다 (회원 출판물에 의해 링크 됨). 따라서 게시자가 번역 대상이 쿼리 된 언어로되어있는 경우 해당 게시자를 얻게되고 pub.publication.all()과 같은 작업을 수행하면 요청한 작업이 수행됩니다. 모든 게시 개체가 반환됩니다. 그 언어의 발행인과 번역 객체는 텍스트와 언어 설정 데이터를 가지고 있기 때문에

는, 당신은 단지 특정 언어에있는 모든 문서의 목록을 원하는 경우

pub = Translation.objects.filter(language=request.LANGUAGE_CODE) 

같은 것을 할 필요가 첫 번째 예제를하지 해결하려면 발행인. = 당신이 특정 출판사를 식별 할 (그리고 related_name 설정

pub = Translation.objects.filter(language=request.LANGUAGE_CODE, publisher=publisher_id) 

또는 어떤 방법 : 당신은 하나 개의 특정 출판사에서 특정 언어에있는 모든 문서의 목록을 원하는 경우

는 같은 다른 필터 변수를 추가 ""나쁜 생각입니다, 왜냐하면 당신은 전혀 반대 관계를 만들 수 없기 때문입니다).

또한 동일한 기사에서 두 개 이상의 게시자가 다른 게시자와 함께 작업하고 M2M이 필요하지 않은 상황이 아니라면 O2M이 필요하기 때문에 Publisher.publication과 ForeignKey의 관계를 변경합니다. (한 출판사는 많은 출판물/번역문을 씁니다).