我遇到过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)
该如何运作以及如何解决或避免该问题?
答案 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(一个出版商写了很多出版物/翻译。)