问题描述
我在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。
任何帮助,将不胜感激。
1楼
尝试重写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'
2楼
您是否看过Django多对一关系模型?