Django: lista inversa de muitos para muitos relação?
-
07-07-2019 - |
Pergunta
Eu tenho dois modelos simples em models.py: Service and host. Host.services tem uma relação de m2m com Service. Em outras palavras, um host tem vários serviços e um serviço pode residir em múltiplos hosts; um m2m básico.
models.py
class Service(models.Model):
servicename = models.CharField(max_length=50)
def __unicode__(self):
return self.servicename
class Admin:
pass
class Host(models.Model):
#...
hostname = models.CharField(max_length=200)
services = models.ManyToManyField(Service)
#...
def service(self):
return "\n".join([s.servicename for s in self.services.all()])
def __unicode__(self):
return self.hostname
class Admin:
pass
Como faço para obter uma saída de um-para-muitos na interface de administração, com o 'Serviço' a classe de base (a inversa de muitos para muitos?).
Do eu preciso usar '_set.all ()'?
Solução
Use related_name
sobre os serviços:
services = models.ManyToManyField(Service, related_name='hosts')
e, em seguida, fazer
service.hosts.all()
para obter os anfitriões para um serviço.
Outras dicas
Isto parece fazer o truque:
class Service(models.Model):
servicename = models.CharField(max_length=50)
def hostname(self):
return "\n".join([s.hostname for s in self.hosts_services.all()])
def __unicode__(self):
return self.servicename
class Host(models.Model):
#...
services = models.ManyToManyField(Service, related_name='hosts_services')
#...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow