如何加入 Django 中的多对多字段

How to join a many to many field in Django

我以前没有使用 Django 的多对多字段的经验。这是我第一次使用它,所以我在这里有点困惑。这是我的:

#models.py
class RefereciaCita(models.Model):
    titulo = models.CharField(max_length=500, null=True, blank=True, help_text='título da pesquisa')
    link = models.URLField(blank=True, null=True, help_text='link da pesquisa')
    #pesquisador = models.ForeignKey('AutorPesquisa',null=True, blank=True, 
            #help_text='pesquisadores que participam da pesquisa', on_delete=models.SET_NULL)
    pesq = models.ManyToManyField('AutoresPesq', related_name='autoresDaPesquisa',through='AutorRef', verbose_name='pesquisador')       
    def __str__(self):
        return self.titulo
    class Meta:
            verbose_name = "Referência bibliográfica"
            verbose_name_plural = "Referências bibliográficas"


class AutoresPesq(models.Model):
    nome = models.CharField(max_length=500, null=True, blank=True, help_text='nome do pesquisador')
    link = models.URLField(blank=True, null=True, help_text='link do currículo do pesquisador')
    pesquisa = models.ManyToManyField('RefereciaCita', through='AutorRef', verbose_name='pesquisador',
        related_name='pesquisaDoAutor', help_text='pesquisa que o autor participa')

def __str__(self):
    return self.nome
class Meta:
        verbose_name = "Autores Pesquisa"
        verbose_name_plural = "Autores Pesquisa"

class AutorRef(models.Model):
    pesquisa = models.ForeignKey(RefereciaCita, null=True, related_name='pesquisarn',
            help_text='pesquisa que o autor participa', on_delete=models.CASCADE)
    pesquisador = models.ForeignKey(AutoresPesq, null=True, related_name='autorDaPesquisa',
        help_text='pesquisadores que participam da pesquisa', on_delete=models.CASCADE)

def __str__(self):
    return self.pesquisador.nome + ", " + self.pesquisa.titulo[:190]

class Meta:
        verbose_name = "Autor Pesquisa"
        verbose_name_plural = "Autor Pesquisa"

我需要从每个 ReferenciaCita 中检索它各自的 AutoresPesq

所以在模板中我会有类似图片的东西

所以,我需要为每个 'researchPaper' 获取 'author'

但我对查询集感到困惑。我已经尝试过 select_related 和 prefetch_related,但我在这里遗漏了一些东西。

中间table是这样的

对于你的第一个问题,你可以这样做:

qs_referencia_cita = ReferenciaCita.objects.all() # All ReferenciaCita

for referencia_cita in qs_referencia_cita:
    for autores_pesq in referencia_cita.pesq.all():
        # Use your autores_pesq

剩下的不清楚你在问什么。

PS:您不需要这两个关系,因为 ManyToManyField:另一个关系是自动创建的,请参阅文档的 this part