如何在admin.TabularInline中访问模型的多属性关系的末尾访问模型的属性

时间:2020-09-16 09:02:26

标签: python django django-admin many-to-many

我正面临以下情况;

#models.py

class A(models.Model):
    dog = models.CharField(...)
    cat_values = models.ManyToManyField(B, through='AtoB')

class AtoB(models.Model):
    one = models.ForeignKey(A)
    two = models.ForeignKey(B)

class B(models.Model):
    cat = models.CharField(...)


#admin.py

class BForm(forms.ModelForm):
    cat = forms.TextInput()

    class Meta:
        model = A.cat_values.through
        exclude = []

class BInline(admin.TabularInline):
    model = B.cat_values.through
    form = BForm
    fields = ['cat', ]
    readonly_fields = ['cat', ]

@admin.register(A)
class AAdmin(admin.ModelAdmin):
    inlines = [BInline,]

当我尝试运行服务器时,出现以下错误消息;

:(admin.E035)'readonly_fields [0]'的值不可调用,'BInline'的属性或'agregator.AtoB的属性'。

没有其他访问方式像A.cat_valuesA.cat_values.two

一样有效

我部分了解问题的根源。它不允许我访问B的属性,而只能访问AtoB的属性。我尝试解决此问题,但未成功。阅读了文档,但是在这种情况下,只有在没有通过模型定义的情况下,才可以访问属性。

例如https://docs.djangoproject.com/en/3.1/topics/db/examples/many_to_many/https://docs.djangoproject.com/en/3.1/topics/db/models/

我需要在A的管理员的内联中显示cat属性。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

所以我已经解决了这个问题。关键是为AtoB模型定义属性。

例如;

class AtoB(models.Model):
    one = models.ForeignKey(A)
    two = models.ForeignKey(B)

    @property
    def cat(self):
        return self.two.cat