Django - 过滤manytomany字段 - request.LANGUAGE_CODE

时间:2012-03-09 06:27:47

标签: django many-to-many

我遇到过filter和m2m关系以及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)

该如何运作以及如何解决或避免该问题?

1 个答案:

答案 0 :(得分: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的关系,因为除非您遇到多个Publisher与同一篇文章上的另一个Publisher一起工作的情况,否则您不需要M2M,您需要O2M(一个出版商写了很多出版物/翻译。)

相关问题