2012-03-09 128 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 (一个发布者写许多出版物/翻译)。