2012-03-09 180 views
1

我一直在遇到過濾器和m2m關係和request.LANGUAGE_CODE的問題。Django - 過濾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

語言屬性是第一個示例中Translation對象的一部分,第二個示例中是Publisher的一部分。此外,在第一個Publisher中沒有自己的文本,但是將M2M引用到包含文本的Translation對象。

因此,在第一個示例中,您要求它選擇發佈者而不是翻譯(由成員發佈鏈接)。因此,如果任何發佈商有任意翻譯對象在查詢語言中,您將獲得該發佈服務器,然後當您執行諸如pub.publication.all()之類的操作時,它將執行您所要求的操作:它將返回關聯的每個發佈對象與任何語言的發佈者。

要解決,你需要做的像

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

的東西,如果你只是想在某一語言的所有文章的列表的第一個例子,因爲翻譯的對象具有文本和語言設置數據,而不是出版商。

如果你想從一個特定發佈特定語言的所有文章的列表,添加了另一個篩選變量,如:

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

或任何你想要的方式,以確定具體的發佈者(和設置related_name = 「」是一個不好的主意,因爲那樣你根本就無法建立反向關係)。

此外,我會改變Publisher.publication到ForeignKey的關係,因爲除非你有一個以上的發佈商與另一個發佈商在同一篇文章上一起工作的情況,你不需要M2M,你需要O2M (一個發佈者寫許多出版物/翻譯)。