我有一个大学和另一个联系模式:

class University(models.Model):

    abbrev = models.CharField(max_length=20, unique=True) # example "ASU" for Alabama State University
    name = models.CharField(max_length=512, unique=True)
    city = models.CharField(max_length=512)
    state = models.CharField(max_length=2, choices=STATE_CHOICES) # abbreviation
    region = models.CharField(max_length=2, choices=REGION_CHOICES) # examples Mid West, South Coast, etc.
    type = models.CharField(max_length=3, choices=TIPO_IES_CHOICES) # public, private, etc.

class UniversityContact(models.Model):

    person ...
    university ... # models.OneToOneField("University") ???

在管理界面上编辑University contact时,我希望能够从University中“拉”'abbrev', 'state', 'region','type'来显示联系人信息。有可能吗?它们不必根据上下文进行编辑。
我试过将这些字段添加到UniversityContact中,都是“models.OneToOneField("University", related_name='...')”,但它们最终都显示了另一个表中的相同值-abbrev
我希望能够快速地按地区等对联系人进行分类。

最佳答案

显示很简单-定义一个返回模型或管理类上相关数据的方法,然后使用list_display和/或readonly_fields中的方法。
对于排序,定义方法的admin_order_field属性。尽管list_displayreadonly_fields不支持与双下划线相关的字段语法,admin_order_field支持。所以像这样:

class UniversityContact(models.Model):
    # as above, plus:
    def abbrev(self):
        return self.university.abbrev
    abbrev.admin_order_field = 'university__abbrev'

如果不需要方法名的默认选项,也可以选择设置short_description属性:
    abbrev.short_description = 'abbreviation'

您没有问过这个问题,但似乎值得知道-list_filter还支持标准的相关字段名语法:
    list_filter = ('university__region',)

或者,这里有一个代码片段声称可以解决这个问题:
http://djangosnippets.org/snippets/2887/
我自己也没试过。

10-07 18:51