当前位置: 代码迷 >> python >> 如何在admin中按ID(没有ForeignKey)加入两个模型并按链接的模型字段排序
  详细解决方案

如何在admin中按ID(没有ForeignKey)加入两个模型并按链接的模型字段排序

热度:32   发布时间:2023-07-16 10:11:41.0

我在django admin中加入两个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 admin:

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

    def related_thing1_name(self, obj):
        try:
            thing = Thing.objects.get(id=obj.related_thing1)
        except ObjectDoesNotExist:
            return ''
        return thing.name

    def related_thing2_name(self, obj):
        try:
            thing = Thing.objects.get(id=obj.related_thing2)
        except ObjectDoesNotExist:
            return ''
        return thing.name

现在到了重点。 到目前为止,一切正常。 但是我现在真正想要的是让_name列可排序。 我确实知道,如果功能列与模型本身完全断开连接,那将是不可能的,但是在这种情况下,我认为这一定有可能实现。 我花了一些时间尝试将ThingRelation与Thing结合起来,但是也许还有其他方法。

而且我不能简单地将IntegerField更改为ForeignKey。

任何帮助,将不胜感激。

尝试重写ModelAdmin queryset方法以添加要查询的字段(通过使用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'

您是否看过Django多对一关系模型?

  相关解决方案