Как привязать множество подмоделей к одной модели в Django?

Здравствуйте! Делаю одностраничное приложение на Джанго 1.9 (с rest framework). Суть проблемы такова:
Есть всего две модели Case(Кейсы) и Article(Множество статей о каждом кейсе), на главной странице выводится только список превью к Кейсам. Но на странице с детальным описанием определённого кейса нужно, помимо информации из самой модели Case, вывести несколько экземпляров Article этого кейса, и вот здесь возникают вопросы. Для последующей передачи всех данных в соответствующий шаблон я использую сериализотор:

from rest_framework import serializers
from landing.models import Case, Article

class CasePreviewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Case
        fields = [
            'id',
            'name',
            'preview',
            'slider_preview',
            'url',
        ]

class CaseDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Case
        fields = [
            'name',
            'slider_preview',
        ]
    class Meta:
        model = Article
        fields = [
            'picture',
            'caption',
        ]


Как видно из этого куска кода, в классе CaseDetailSerializer я наивно пытаюсь дважды определить Мета-класс - сначала для модели Case, а потом - для Article, чтобы получить все необходимые для представления данные, однако Джанго выкидывает ошибку.

models.py:
from django.db import models
from django.utils.translation import ugettext_lazy as _

class Case(models.Model):
    name = models.CharField(_('case name'), max_length=30)
    preview = models.ImageField(_('preview image'), upload_to="images")
    created_at = models.DateTimeField(_('created at'), auto_now_add=True)
    slider = models.BooleanField(_('is slider preview availible'))
    if slider:
        slider_preview = models.ImageField(_('slider preview'), upload_to="images")

    def __str__(self):
        return self.name

class Article(models.Model):
    case = models.ForeignKey(Case)
    picture = models.ImageField(_('picture'), upload_to="images")
    caption = models.TextField(_('text'), max_length=501)

    def __str__(self):
        return self.caption


views.py
from rest_framework import viewsets
from .serializers import *

class CaseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Case.objects.all()

    def get_serializer_class(self):
        if self.action == 'list':
            return CasePreviewSerializer
        return CaseDetailSerializer


Возможно, я в корне неправильно реализовываю такую концепцию (чтобы у каждого экземпляра Case было множество экземпляров Article)?
  • Вопрос задан
  • 308 просмотров
Решения вопроса 1
Модели Case и Article должны быть связаны с помощью ForeignKey.
class Article(models.Model):
    ...
    case = models.ForeignKey(Case, related_name='articles')
    ...

Теперь в сериалайзере CaseSerializer вы можете отобразить связи в виде PrimaryKeyRelation или с помощью вложенного сериалайзера
class CaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Case
        fields = (..., ..., 'articles')


Почитайте доки по теме
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@hellpirat
Full stack developer (Python/Django, React.js)
В case:
articles = models.ManyToMany(Article)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы