Django:在模板中过滤数据库查询

时间:2018-09-19 12:52:10

标签: python django python-3.x

我认为答案很简单,但我无法弄清楚。因此,我有三个模型:宿主,项目和将这两个模型相关联的模型。在我的模板中,我有两个“选择”输入,一个用于主机,一个用于项目。我想做的是仅显示与当前选定的主机相关的项目(这些关系在第三个模型中进行了描述)。也许在views.py文件中比在html页面中有更好的方法。

代码:

class Projetos(models.Model):
    nomeAlias = models.CharField("Nome do Projeto",max_length=50, default='Personalizado')
    nome = models.CharField("Nome do Projeto(Artifactory)",max_length=50, primary_key=True)
    repositorio = models.CharField("Repositório do Projeto", max_length=150)
    remote_war = models.CharField("Nome do WAR do projeto",max_length=150)

class Maquina(models.Model):
    nome = models.CharField("Nome da Máquina",max_length=20) 
    endereco = models.CharField("Endereço da Máquina",max_length=300, primary_key=True)

class RelMaquinaProjeto(models.Model):
    maquina = models.ForeignKey(Maquina, on_delete=models.CASCADE,related_name='relacoes',verbose_name="Nome da Máquina")
    projeto = models.ForeignKey(Projetos, on_delete=models.CASCADE,related_name='projetos_em',verbose_name="Nome do Projeto")
    contexto = models.CharField("Contexto",max_length=20)

2 个答案:

答案 0 :(得分:0)

看起来ProjetosMaquina模型是通过多对多关系关联的。由于您已经为此关系定义了模型,因此可以使其成为直通模型,并在如下表之一中定义字段。

另请参阅the Django docs for many-to-many

class Projetos(models.Model): 
   nomeAlias = models.CharField("Nome do Projeto",max_length=50, 
   default='Personalizado')
   nome = models.CharField("Nome do Projeto(Artifactory)",max_length=50, 
   primary_key=True)
   repositorio = models.CharField("Repositório do Projeto", max_length=150)
   remote_war = models.CharField("Nome do WAR do projeto",max_length=150)

class Maquina(models.Model):
   nome = models.CharField("Nome da Máquina",max_length=20) 
   endereco = models.CharField("Endereço da Máquina",max_length=300, 
   primary_key=True)
   projetos = models.ManyToManyField(Projetos, through='RelMaquinaProjeto', related_name='maquinas')

class RelMaquinaProjeto(models.Model):
   maquina = models.ForeignKey(Maquina, 
   on_delete=models.CASCADE,verbose_name="Nome da Máquina")
   projeto = models.ForeignKey(Projetos, 
   on_delete=models.CASCADE, verbose_name="Nome do Projeto")
   contexto = models.CharField("Contexto",max_length=20)

现在要为宿主对象选择所有项目,您可以执行以下操作。

maquina.projetos.all()

要为一个项目对象选择所有主机,您也可以这样做

projeto.maquinas.all()

或者您可以根据需要使用直通模型进行过滤

#retrieve all maquina-projetos for a given maquina

models.RelMaquinaProjeto.objects.filter(maquina=maquina)

答案 1 :(得分:0)

如果您按照in the Django docs here的描述使用requireGestureRecognizerToFail建立关系,则Django知道两个模型之间的关系类型,并在管理员。

要编写自己的“两步选择”,您将需要客户端上的JavaScript来更改第二个选择框中的值。根据您拥有的数据量,您可以在初始加载时将所有“第二选择框”的所有选项发送给客户端。

或者(并且更有可能)当用户选择其他“第一个选项”时,您需要从服务器获取数据。据我所知,没有做到这一点。