如何在管理中按id(不带ForeignKey)连接两个模型并按链接的模型字段排序

2024-09-30 22:16:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在django管理中加入两个django模型有问题。在

我拥有什么,我不能改变什么? (当然,这是我真正拥有的改变了的捷径)

class Thing(models.Model):
    name = models.CharField()

class ThingRelation(models.Model):
    related_thing1 = models.IntegerField()
    related_thing2 = models.IntegerField()

其中related_thing是与Thing.id的关系。在

现在我有Django管理员:

^{pr2}$

现在说正题。到目前为止一切正常。但我现在真正想要的是使_name列可排序。我知道,这是不可能的,如果功能列完全脱离模型本身,但在这种情况下,我想这一定是可能的。我花了一些时间试图把事物和事物联系起来,但也许还有其他的方法。在

我不能简单地把IntegerField改成ForeignKey。在

任何帮助都将不胜感激。在


Tags: djangoname模型modelmodelsclass事物捷径
2条回答

尝试重写ModelAdminqueryset方法,以向查询添加字段(通过使用queryset ^{}方法),您可以对其进行排序,然后使用admin_order_field属性:

class ThingRelationAdmin(admin.ModelAdmin):
    list_display = ('related_thing1', 'related_thing1_name',
                    'related_thing2', 'related_thing2_name')

    def queryset(self, request):
        qs = super(ThingRelationAdmin, self).queryset(request)
        # change appname to your application name in which this models placed
        qs = qs.extra(
            select = {
                'rt1name': 't1.name',
                'rt2name': 't2.name'
            },
            tables=['"appname_thing" as "t1"', '"appname_thing" as "t2"'],
            where=['appname_thingrelation.related_thing1=t1.id',
                   'appname_thingrelation.related_thing2=t2.id']
        )
        return qs

    def related_thing1_name(self, obj):
        return obj.rt1name

    def related_thing2_name(self, obj):
        return obj.rt2name

    related_thing1_name.admin_order_field = 'rt1name'
    related_thing2_name.admin_order_field = 'rt2name'

相关问题 更多 >