Django - Как получить объект на другой модели приложения без прямой связи в родительской модели?

У меня есть Profile model, Award model как дочерние элементы модели Profile [которая принимает другие детали награды, такие как детали достижения], и List_of_awards model как дочерние элементы модели Award [которая принимает список наград и подсчет того, сколько профилей имеет конкретную награду].

Award model находится в строке Profile model с использованием Foreignkey и List_of_awards model как Foreignkey field в Award model для выбора наград.

Я пытаюсь сделать следующее: отобразить List_of_awards в Profile model. Идея возникла, когда я смог отобразить List_of_awards в list_display в Award model', so, I was trying to link List_of_awardsin theProfile`, который не имеет прямой связи.

class Profile(models.Model):
     first_name                          = models.CharField(verbose_name=_('First Name'), max_length=255, null=True, blank=True, )
     middle_name                         = models.CharField(verbose_name=_('Middle Name'), max_length=255, null=True, blank=True)
     last_name                           = models.CharField(verbose_name=_('Last Name'), max_length=255, null=True, blank=True)
     ....

class Award(models.Model):
    list_of_award       = models.ForeignKey('system_settings.Ribbon', related_name='awards_ad_ribbon', on_delete=models.DO_NOTHING, verbose_name=_('Type of Award'), blank=True, null=True)
    achievement         = models.TextField(verbose_name=_('Achievement'))
    profile             = models.ForeignKey('reservist_profile.Profile', related_name='awards_ad_profile', verbose_name=_('Profile'), on_delete=models.DO_NOTHING, blank=True, null=True)

     def image_tag(self):
        from django.utils.html import format_html
        return format_html('<img src="/static/media/%s" title="" width="75" /> %s' % (self.list_of_award.image,self.list_of_award.award))
     image_tag.short_description = 'Award'

class Ribbon(models.Model):
award      = models.CharField(verbose_name=_('Award'), max_length=255, null=True, blank=True)
award_desc = models.TextField(verbose_name=_('Description'), max_length=255, null=True, blank=True)
image       = models.ImageField(verbose_name = _('Image'), upload_to = award_image_location, blank = True, null = True)

class Meta:
    verbose_name = _('List of awards')
    verbose_name_plural = _('List of awards')

def __str__(self):
    return '%s' % (self.award)


def image_tag(self):
    return format_html('<img src="/static/media/%s" width="75" />' % (self.image))

image_tag.short_description = 'Award Image'

Итак, это то, что у меня есть на данный момент, другие функции приходят через исследование, но этот конкретный сценарий, я понятия не имею, что такое ключевое слово поиска, поэтому я извиняюсь, если это уже спрашивал кто-то. спасибо.

Вы можете попробовать следующим образом:

class ProfileAdmin(admin.ModelAdmin):
    list_display = ('first_name',... 'list_of_awards')
    
    @admin.display(description='Awards')
    def list_of_awards(self, obj):
        return ",".join([k.list_of_award.award for k in obj.awards_ad_profile.all()]

Больше информации можно найти в документации.

Вернуться на верх