Question

I have two simple models in models.py: Service and Host. Host.services has a m2m relationship with Service. In other words, a host has several services and one service can reside on multiple hosts; a basic m2m.

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

How do I get a one-to-many output in the admin interface, with the class 'Service' as basis (a reverse many-to-many?).

Do I need to use '_set.all()' ?

Was it helpful?

Solution

Use related_name on the services:

services = models.ManyToManyField(Service, related_name='hosts')

and then do

service.hosts.all()

to get the hosts for a service.

OTHER TIPS

This seems to do the trick:

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')
    #...
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top