我认为答案很简单,但我无法弄清楚。因此,我有三个模型:宿主,项目和将这两个模型相关联的模型。在我的模板中,我有两个“选择”输入,一个用于主机,一个用于项目。我想做的是仅显示与当前选定的主机相关的项目(这些关系在第三个模型中进行了描述)。也许在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)
答案 0 :(得分:0)
看起来Projetos
和Maquina
模型是通过多对多关系关联的。由于您已经为此关系定义了模型,因此可以使其成为直通模型,并在如下表之一中定义字段。
另请参阅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来更改第二个选择框中的值。根据您拥有的数据量,您可以在初始加载时将所有“第二选择框”的所有选项发送给客户端。
或者(并且更有可能)当用户选择其他“第一个选项”时,您需要从服务器获取数据。据我所知,没有做到这一点。