Как обрабатывать топологию звезды в Django Rest Framework

У меня есть модель Django следующего вида:

class A(models.Model):
    slug = models.CharField(max_length=20, primary_key=True, unique=True)
    dataA = models.IntegerField(null=True, blank=True)

class B(models.Model):
    slug= models.OneToOneField(A, to_field="slug", db_column="slug", on_delete=models.CASCADE, related_name='b')
    dataB = models.IntegerField(null=True, blank=True)

class C(models.Model):
    ticker = models.OneToOneField(A, to_field="slug", db_column="slug", on_delete=models.CASCADE, related_name='c')
    dataC = models.IntegerField(null=True, blank=True)

class D(models.Model):
    ticker = models.ForeignKey(A, to_field="slug", db_column="slug", on_delete=models.CASCADE, related_name='d')
    dataD = models.IntegerField(null=True, blank=True)

Это похоже на топологию звезды. B, C создают отношение OneToOne с A, а D создает отношение OneToMany с A. Итак, я хочу, чтобы Django rest framework получил API, в котором, когда пользователь обращается к API с полем slug в A. Он будет получать данные B, C, D тоже в одном вызове. Я написал код следующим образом.

class DSerializer(serializers.ModelSerializer):
    slug = serializers.PrimaryKeyRelatedField(queryset=D.objects.all())
    class Meta:
        model = D
        fields = ['dataD', 'slug']

class ASerializers(serializers.ModelSerializer):
    d = DSerializer(many=True, read_only=True)
    class Meta:
        model = A
        fields = ['slug','dataA', 'd']

@api_view(['GET'])
def api(request, slug):
    if request.method == 'GET':
        try:
            a= A.objects.prefetch_related('d').get(slug=slug)
        except A.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializers = ASerializers(a)
        return Response(serializers.data)

Мой вывод возвращает следующий формат JSON.

{
    "slug": "term",
    "dataA": 1,
    "d": [{
            "dataD": 2,
            "slug": "term"
        }, {
            "dataD": 3,
            "slug": "term"
        }, {
            "dataD": 4,
            "slug": "term"
        }, {
            "dataD": 5,
            "slug": "term"
        }
    ]
}

Теперь я хочу сделать несколько вещей, которые я не могу понять:

  • Я хочу настроить этот запрос. Например, на выводе d я хочу получить только 2 последних вывода, отсортированных по полю dataD. На данный момент он возвращает все строки.
  • .
  • Я также хочу получить вывод B, C в сериализаторах, как будто он должен показать b и c, прикрепленные к JSON.
  • Еще одна вещь в этой строке "slug = serializers.PrimaryKeyRelatedField(queryset=D.objects.all())", get(slug=slug) или .order_by('dataD').ilter(slug=slug)[:2] не работает, потому что нет переменной slug в сериализаторе.

Было бы очень полезно, если бы кто-нибудь рассказал мне подробности, например, как здесь все будет работать. Заранее спасибо.

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