Как извлечь данные из более чем двух таблиц с отношениями "многие ко многим" Что я хочу?
1 ) Я хочу добавлять страницы и извлекать метаданные страницы из таблицы pagemeta. Одна страница будет иметь больше, чем pagemeta.
PageMeta Table , will have section(many to many relationship) and key and value like: Keyname: _contact_collapse Value: People usually ask these
Section Table name: _contact_us_fax
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)
Я пытался достичь цели этим способом, но не могу продвинуться вперед и получить необходимую информацию управляемым способом