【问题标题】:Django: reverse list of many to many relationship?Django:多对多关系的反向列表?
【发布时间】:2009-09-14 14:14:57
【问题描述】:

我在 models.py 中有两个简单的模型:服务和主机。 Host.services 与 Service 有 m2m 关系。 换句话说,一个主机有多个服务,一个服务可以驻留在多个主机上;一个基本的 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

如何在管理界面中以“服务”类为基础获得一对多输出(反向多对多?)。

我需要使用 '_set.all()' 吗?

【问题讨论】:

    标签: django-models django-admin


    【解决方案1】:

    在服务上使用related_name

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

    然后做

    service.hosts.all()
    

    获取服务的主机。

    【讨论】:

    • 我把这个:service.hosts.all()放在'class Host'中吗?
    • 没有。如果你有一个Host 实例host 并且你想找到它的服务,你会做host.services.all()。同样,如果您有一个Service 实例service 并且您想找到它的主机,您可以使用service.hosts.all()。在这里,service 是您在任何特定时间感兴趣的特定 Service 实例。
    • 这通常会进入视图代码(例如,在查看服务信息时显示服务的主机)
    【解决方案2】:

    这似乎可以解决问题:

    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')
        #...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      相关资源
      最近更新 更多