Django фильтровать отношение "многие ко многим" - PullRequest
0 голосов
/ 27 мая 2020

У меня проблема со многими моделями в django. У меня структура такая:

Таблица Проект

class Project(models.Model):
    name = models.CharField(max_length=100, blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    ordernr = models.IntegerField(db_column='orderNr', blank=True, null=True)  # Field name made lowercase.
    map = models.ManyToManyField(Image, through='ProjectMapImage')

    class Meta:
         managed = False
         db_table = 'Project'

И таблица Изображение

class Image(models.Model):
     url = models.CharField(max_length=100, blank=True, null=True)
     typeid = models.ForeignKey('ImageType', models.DO_NOTHING, db_column='typeId', blank=True, null=True)  # Field name made lowercase.
     ordernr = models.IntegerField(db_column='orderNr', blank=True, null=True)  # Field name made lowercase.

     class Meta:
         managed = False
         db_table = 'Image'
         ordering = ['ordernr']

Таблица сопоставления ProjectMapImage

class ProjectMapImage(models.Model):
     projectid = models.ForeignKey(Project, models.DO_NOTHING, db_column='projectId', blank=True,
                                   null=True)  # Field name made lowercase.
     imageid = models.ForeignKey(Image, models.DO_NOTHING, db_column='imageId', blank=True,
                                 null=True)  # Field name made lowercase.

     class Meta:
         managed = False
         db_table = 'Project_Map_Image'

Наконец, это мое представление

class ProjectListView(ListView):
     model = Project
     context_object_name = "projects"

Это представление возвращает весь проект, и у меня есть доступ ко всем связанным изображениям в HTML {% for image in project.map.all %}

Но я хочу загружать только изображения с typeid, например 1 . Как это отфильтровать?

1 Ответ

0 голосов
/ 27 мая 2020

Я считаю, что вы можете просто добавить целевой набор запросов, который хотите использовать во внешнем интерфейсе.

class ProjectListView(ListView):
    model = Project
    context_object_name = "projects"

    def get_queryset(self):
        return Project.objects.filter(imageid__typeid=1)

Или вы можете сделать логический фильтр в шаблоне, чтобы проверить typeid перед рендерингом, проверив атрибут в шаблоне logi c.

...