Django: фильтр запросов к базе данных в шаблоне - PullRequest
0 голосов
/ 19 сентября 2018

Я думаю, что ответ прост, но я не могу понять это.Итак, у меня есть три модели: хост, проект и модель, которая связывает эти две модели.В моем шаблоне у меня есть два входа «select», один для хоста и один для проекта.Я хочу показать только те проекты, которые связаны с выбранным хостом (отношения описаны в третьей модели).Возможно, есть лучший способ сделать это в файле 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 голосов
/ 19 сентября 2018

Если вы построите отношение, используя models.ManyToManyField(), как описано в документации Django здесь , тогда Django узнает о типе отношений между двумя моделями и отобразит «двухэтапный выбор»в Admin .

Чтобы написать свой собственный «двухэтапный выбор», вам потребуется JavaScript на клиенте для изменения значений во втором поле выбора.В зависимости от того, сколько у вас есть данных, вы можете просто отправить все опции для всех «вторых блоков выбора» клиенту при начальной загрузке.

Или (и более вероятно) вам нужно будет извлечь данные с сервера, когда пользователь выбирает другой «первый вариант».Для этого, насколько я знаю, не существует виджета "плагин".

0 голосов
/ 19 сентября 2018

Похоже, что ваши модели Projetos и Maquina связаны через отношения многие ко многим.Поскольку вы уже определили модель для этого отношения, вы можете сделать ее сквозной моделью и определить поле в одной из таблиц, как показано ниже.

Также см. документы Django для многих ко многим

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...