Создание конечной точки DRF с CRUD для модели Wagtail с полями StreamField, унаследованными от Page Class - PullRequest
0 голосов
/ 25 февраля 2019
  1. Вопрос в том, как должен выглядеть сериализатор DRF?для работы с такой моделью. Потому что я не смог использовать PUT-запрос для создания нового поста (faq).В классе Page есть такие поля, которые являются обязательными и необходимыми, но я не понимаю, как я буду создавать новую запись, если мне нужно будет вставить 'slug', 'deep', 'title', 'path' в запрос.И где я мог бы взять их.
  2. Поля внутри StreamFields внедрены, и мой DRF возвращает не JSON, внутри этого поля он возвращает строку.Может быть, кто-то уже сделал это и мог бы помочь.Спасибо.

models.py

from wagtail.core.models import Page

class TranslatedField:
def __init__(self, en_field, ru_field, tr_field, nl_field):
    self.en_field = en_field
    self.ru_field = ru_field
    self.tr_field = tr_field
    self.nl_field = nl_field

def __get__(self, instance, owner):
    if translation.get_language() == 'ru':
        return getattr(instance, self.ru_field)
    elif translation.get_language() == 'tr':
        return getattr(instance, self.tr_field)
    elif translation.get_language() == 'nl':
        return getattr(instance, self.nl_field)
    else:
        return getattr(instance, self.en_field)
class FaqPage(Page):
header = models.BooleanField(default=True)
groups_en = StreamField(
    [
        ('groups', blocks.ListBlock(blocks.StructBlock([
            ('group_name', blocks.RichTextBlock()),
            ('questions', blocks.ListBlock(blocks.StructBlock([
                ('question', blocks.RichTextBlock()),
                ('answer', blocks.RichTextBlock())
            ]))
             )
        ]
        )))
    ]
    , blank=True)
groups_ru = StreamField(
    [
        ('groups', blocks.ListBlock(blocks.StructBlock([
            ('group_name', blocks.RichTextBlock()),
            ('questions', blocks.ListBlock(blocks.StructBlock([
                ('question', blocks.RichTextBlock()),
                ('answer', blocks.RichTextBlock())
            ]))
             )
        ]
        )))
    ]
    , blank=True)
groups_tr = StreamField(
    [
        ('groups', blocks.ListBlock(blocks.StructBlock([
            ('group_name', blocks.RichTextBlock()),
            ('questions', blocks.ListBlock(blocks.StructBlock([
                ('question', blocks.RichTextBlock()),
                ('answer', blocks.RichTextBlock())
            ]))
             ),
        ]
        )))
    ]
    , blank=True)
groups_nl = StreamField(
    [
        ('groups', blocks.ListBlock(blocks.StructBlock([
            ('group_name', blocks.RichTextBlock()),
            ('questions', blocks.ListBlock(blocks.StructBlock([
                ('question', blocks.RichTextBlock()),
                ('answer', blocks.RichTextBlock())
            ]))
             ),
        ]
        )))
    ]
    , blank=True)
groups = TranslatedField('groups_en', 'groups_ru', 'groups_tr', 'groups_nl')
translated_title_en = models.CharField(blank=True, max_length=100)
translated_title_ru = models.CharField(blank=True, max_length=100)
translated_title_tr = models.CharField(blank=True, max_length=100)
translated_title_nl = models.CharField(blank=True, max_length=100)
translated_title = TranslatedField('translated_title_en', 'translated_title_ru', 'translated_title_tr',
                                   'translated_title_nl')
content_panels = Page.content_panels + [
    FieldPanel('translated_title_en', classname='t_en'),
    FieldPanel('translated_title_ru', classname='t_ru'),
    FieldPanel('translated_title_tr', classname='t_tr'),
    FieldPanel('translated_title_nl', classname='t_nl'),
    StreamFieldPanel('groups_en'),
    StreamFieldPanel('groups_ru'),
    StreamFieldPanel('groups_tr'),
    StreamFieldPanel('groups_nl'),

]

serializers.py

class FaqSerializer(serializers.ModelSerializer):
"""
This viewset automatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
"""
class Meta:
    model = FaqPage
    fields = [
        'id',
        'header',
        # 'groups_en',
        # 'groups_ru',
        # 'groups_tr',
        # 'groups_nl',
        # 'translated_title_en',
        # 'translated_title_ru',
        # 'translated_title_tr',
        # 'translated_title_nl',

        'path', # i don't understand how it works in Page class
        'depth', # and what should be here? and in title and slug
        'title',
        'slug',

]

Я смотрю этот урок о [трясогузке] https://www.youtube.com/watch?v=_X3-EODO9G4&lc=z22tzdwrnuuohry4l04t1aokgqo0yca153lhfeiq1je5rk0h00410.1551287462019827 задал автору несколько вопросов и понял, что если мне нужно использовать пользовательскую часть администратора.Я перепишу все.И решил прекратить использовать трясогузку и сделать пользовательскую часть администратора

...