Проблема с выводом результатов набора запросов и элементов в администраторе Django

#django #django-templates #django-admin

Вопрос:

У меня есть эти модели:

 class Academic(models.Model):   surname = models.CharField(max_length=100, blank=True)  forename = models.CharField(max_length=100, blank=True)   def __str__(self):  return '{}, {}'.format(self.surname, self.forename)  class Partner(models.Model):   name = models.CharField(max_length=200, verbose_name="Organisation name")  class ResearchActivity(models.Model):   title = models.CharField(max_length=200)  academic = models.ManyToManyField(Academic, blank=True)  partner = models.ManyToManyField(Partner, blank=True)  

Я хочу вывести академиков, связанных с партнером, с помощью ResearchActivity модели. У меня есть этот декоратор в моем admin.py:

 @admin.register(Partner) class PartnerAdmin(admin.ModelAdmin):   readonly_fields = ('get_academic_links',)   @admin.display(description='Academic link(s)')  def get_academic_links(self, obj):    for ac in ResearchActivity.objects.filter(partner=obj.id).values_list('academic', flat=True).distinct():  return mark_safe('lt;a href={}gt;'   ac.surname   'lt;/agt;', ac)  

Это вроде как работает. Если я вернусь только ac тогда, я получу удостоверение личности этого академика. Я ожидал бы получить «имя, фамилию», согласно def __str__(self): декоратору.

Что еще более важно, если я попытаюсь создать гиперссылку (см. Код выше), администратор выведет «-» и ничего больше. Что я упускаю?

Обновить

Этот код:

 academics_set = list(ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct())  return academics_set  

ВОЗВРАТ

  [('forename1', 'surname1'), ('forename2', 'surname2'), ('forename3', 'surname3')]   

Почему этот код:

 academics_set = list(ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct())  for ac in academics_set:  return ac  

возвращает только первый элемент этого списка:

 ('forename1', 'surname1')   

Я не могу понять, почему.

Частичное решение

Частичное решение, вывод всех трех имен, хотя и в необработанном формате:

 academics_set = ResearchActivity.objects.filter(partner=obj.id).values_list('academic__forename', 'academic__surname').distinct()  html = []  for ac in academics_set:  html.append("%s %s" % (ac[0], ac[1]))  return mark_safe(html)  

Это выводит:

 ['person1', 'person2', 'person3']  

Я хотел бы вывести:

 lt;a href="/admin/academic/academic_1_id/change"gt;academic name 1lt;/agt;, lt;a href="/admin/academic/academic_2_id/change"gt;academic name 2lt;/agt;, lt;a href="/admin/academic/academic_3_id/change"gt;academic name 3lt;/agt;  

Ответ №1:

Это окончательное решение, которого мне удалось достичь:

@admin.display(описание=’Академическая ссылка(ы)’) для ссылок get_academic_links(self, obj):

 return format_html_join(  ', ',  mark_safe("lt;a href='/admin/artsdb/academic/{}/change/' target='_blank'gt;{} {}lt;/agt;"),  ((ac['academic__id'], ac['academic__forename'], ac['academic__surname']) for ac in ResearchActivity.objects.filter(partner=obj.id).values('academic__forename', 'academic__surname', 'academic__id').distinct())  )  

Я бы, наконец, хотел сгруппировать ученых по исследовательской активности, хотя я не вижу, как это сделать. Если я изменю набор запросов на ResearchActivity.objects.filter(partner=obj.id) и затем получу доступ ac.academic , у меня не будет никаких входных данных.