在 Django Admin 中,如何为 `list_display` 引用反向外键关系?

问题描述 投票:0回答:1

在我的应用程序中,我们可能随时出现新的语言或语言方言,并且用一种语言或方言编写的文本可能需要翻译成另一种语言或方言。这就是为什么我们通过将不同语言的文本关联到“族”(即不同语言的翻译集)来处理文本。

class StringFamily(models.Model):
    id = models.AutoField(primary_key=True)
    # plus some other fields


class String(models.Model):
    id = models.AutoField(primary_key=True)

    # the reference to StringFamily
    family = models.ForeignKey(StringFamily, null=False, on_delete=models.CASCADE)

    # other important stuff
    language = models.ForeignKey(Language, on_delete=models.DO_NOTHING)
    dialect = models.ForeignKey(Dialect, null=True, on_delete=models.SET_NULL)
    text = models.TextField(null=False)

不幸的是,这使得 Django ORM 的使用变得复杂。当我们遇到应用程序问题时,通常可以通过使用原始 SQL 来处理此设置来避免问题。但我也想使用 Django 管理,但我没有看到任何 SQL 解决方法。

特别是,有各种模型的某些文本可能以多种语言出现,如下所示:

class Element(models.Model):
    id = models.AutoField(primary_key=True)
    element_role = models.ForeignKey(ElementRole, null=False, on_delete=models.RESTRICT)
    string_family = models.ForeignKey(StringFamily, null=True, on_delete=models.SET_NULL)
    # plus more fields

我想要的是能够做到这样的事情(除了

"display_english_string"
之外,这里的一切都有效):

class ElementAdmin(admin.ModelAdmin):
    list_display = ("element_role", "display_element_type", "display_english_string")

这有效(正常使用外键):

class Element(models.Model):
    # first model definition, then...
    def display_element_type(self) -> str:
        return str(self.element_role.element_type)

    display_element_type.short_description = 'Element Type'

我也想要这样的东西:

class Element(models.Model):
    # first above code, then...
    def display_english_string(self) -> str:
        strings = self.string_family.strings # this is the reference I would like to work but doesn't
        english_string = strings.filter(language="eng").values("text")[0]
        return english_string

    display_english_string.short_description = 'English Text'

就其价值而言,以上内容给了我

AttributeError: 'StringFamily' object has no attribute 'string'

有什么办法可以实现这个目标吗?

django django-models django-admin django-orm
1个回答
0
投票

默认情况下,Django 将与

class_name_set
创建反向关系,因此很可能反向关系是
string_set
。如果这不起作用,我通常会做的是
print(dir(self.string_family))
查看所有属性,通常我能够找到正确的属性。

© www.soinside.com 2019 - 2024. All rights reserved.