python - How to join two models by id (without ForeignKey) and sort by linked model fields in admin -
i have problem joining 2 django models in django admin.
what have , can't change? (of course changed shortcut of have)
class thing(models.model): name = models.charfield() class thingrelation(models.model): related_thing1 = models.integerfield() related_thing2 = models.integerfield()
where related_thing
relation thing.id
.
now have 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
now point. far works fine. want right have _name
columns sortable. know, impossible, if functional columns totally disconnected models itselves, in situation guess must somehow possible. i've spent time trying achieve joining thingrelation thing, maybe there's other way.
and can't change integerfield foreignkey.
any appreciated.
try override modeladmin
queryset
method add fields query (by using queryset extra
method) on can sort , use admin_order_field
attribute:
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 application name in models placed qs = qs.extra( select = { 'rt1name': 't1.name', 'rt2name': 't2.name' }, tables=['"appname_thing" "t1"', '"appname_thing" "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'
Comments
Post a Comment