Как извлечь данные из более чем двух таблиц с отношениями "многие ко многим" Что я хочу?

1 ) Я хочу добавлять страницы и извлекать метаданные страницы из таблицы pagemeta. Одна страница будет иметь больше, чем pagemeta.

  1. PageMeta Table , will have section(many to many relationship) and key and value like: Keyname: _contact_collapse Value: People usually ask these

  2. Section Table name: _contact_us_fax

  3. ModelsMeta Table This table will have: sectionname( foreign key) model_key : choices , for example: _heading_title, _heading_paragraph meta_vale ( this is for charfield) meta_content: HTML Field

Чего я хочу добиться от этого? Я хочу сделать свою собственную простую CMS, в которой я могу создавать динамические страницы и назначать поля страницам, устанавливая связи с другими таблицами с помощью отношений "многие ко многим" или "внешний ключ", когда это необходимо. устанавливая связь с другими таблицами через отношения "многие ко многим" или "внешний ключ", когда это необходимо.

В чем проблема?

Чтобы опубликовать содержимое конкретной страницы, мне нужно знать pagemeta id's этой страницы из этих идентификаторов таблиц pagemeta мне нужно найти таблицу секции, относящуюся к каждой из них и из id секции мне нужно будет найти информацию из таблицы ModelsMeta. Из этого, я надеюсь, я смогу создать cms систему, в которой я смогу вызывать данные других таблиц из пары ключ-значение.

Мой код структуры таблицы:

class SectionKey(models.Model):
      model_name =models.CharField(max_length=200)
            
      class Meta:
            
            verbose_name = "Section"
            verbose_name_plural = "Section"

      def __str__(self):
            return self.model_name



class Models(models.Model):
      model_name =models.CharField(max_length=200)
      
            
      class Meta:
            
            verbose_name = "Models"
            verbose_name_plural = "Models"

      def __str__(self):
            return self.model_name

class ModelsMeta(models.Model):
      model_meta_name =models.ForeignKey(SectionKey, on_delete= models.CASCADE,related_name='sectionKey')
      modelkey = models.ForeignKey(Models, on_delete= models.CASCADE,related_name='Models', default=0)
      meta_value =  models.CharField(max_length=200)
      meta_content = HTMLField()
      class Meta:
           
        verbose_name = "Models Meta"
        verbose_name_plural = "Models Meta"

      def __str__(self):
            return self.meta_value

class PageMeta(models.Model):
      section = models.ManyToManyField(SectionKey)
      name = models.CharField(max_length=500, blank=True)
      title = models.CharField(max_length=500, blank=True)
      """key=models.CharField(max_length=500)
      value=models.CharField(max_length=500)"""

      class Meta:
            
        verbose_name = "Page Meta"
        verbose_name_plural = "Page Meta"      

      def __str__(self):
            return self.name

class Page(models.Model):
      name=models.CharField(max_length=500)
      title = models.CharField(max_length=500)
      content = models.CharField(max_length=500)
      author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='page')
      updated_on = models.DateTimeField(auto_now= True)
      content =  HTMLField()
      page_meta = models.ManyToManyField(PageMeta)
      created_on = models.DateTimeField(auto_now_add=True)
      slug = models.SlugField(max_length=200, unique=True, default=0)
      status = models.IntegerField(choices=STATUS, default=0)

      class Meta:
           
        verbose_name = "Page"
        verbose_name_plural = "Pages"

      def __str__(self):
            return self.title
  

Что я сделал:

def contact(request, slug):
    page = get_object_or_404(Page, slug=slug)
    meta = page.page_meta.values_list('id', flat=True)
    page_meta = Page.objects.filter(id__in=meta)
    section = PageMeta.objects.prefetch_related('section', id__in=meta)
    models = ModelsMeta.objects.prefetch_related('section', id__in=section)

Я пытался достичь цели этим способом, но не могу продвинуться вперед и получить необходимую информацию управляемым способом

Вернуться на верх