Получить связанные поля в Djando Rest Framework - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующие модели, которые представляют статью, автора и компанию (где автор работает):

    class Article(models.Model):
        article_title = models.CharField(max_length=250)
        article_url = models.URLField(max_length=250)
        article_pub_date = models.DateField()


    class Company(models.Model):
        company_name = models.CharField(max_length=250)


    class Author(models.Model):
            author_sf_id = models.CharField(max_length=20, unique=True)
            author_name = models.CharField(max_length=250)
            article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='author')
            company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='author')

Мои сериализаторы:

class ArticleSerializer(serializers.ModelSerializer):

    class Meta:
        model = Article
        fields = ('__all__')
        depth = 2

class CompanySerializer(serializers.ModelSerializer):
    class Meta:
        model= Company
        fields = ('__all__')

class AuthorSerializer(serializers.ModelSerializer):
    article = ArticleSerializer()
    class Meta:
        model = Author
        fields = ('__all__')`

Мои просмотры:

class ArticleList(ListAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer


class AuthorList(ListAPIView):
    queryset = Author.objects.all().order_by('author_name')
    serializer_class = AuthorSerializer


class CompanyList(ListAPIView):
    queryset = Company.objects.all().order_by('company_name')
    serializer_class = CompanySerializer

В DRF я хочу получить все статьи Автора и его членов Компании с URL-адресом, который будет принимать article_url, например: /api/v1/{article_url}. Я пробовал различные комбинации, но пока мне удалось только получить все статьи от автора. Идея, о которой я подумал, заключается в переопределении get_object метода ListAPIView таким образом, чтобы помочь получить эти поля.

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 21 апреля 2020

Вам необходимо настраиваемое представление, которое принимает параметр запроса для использования при фильтрации набора запросов. Таким образом, ваш URL будет выглядеть примерно так:

api/v1/articles?author_id={ID}

А ваш вид:

class ArticleList(ListAPIView):
    serializer_class = ArticleSerializer

    def get_queryset(self):
        # get author id from query params
        author_id = self.request.query_params.get('author_id')
        # use id to determine author's company
        author_company = Company.objects.filter(author__id=author_id)
        # filter articles by author_company
        return Article.objects.filter(author__company=author_company)
...