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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -