Как обрабатывать топологию звезды в 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 в сериализаторе.
Было бы очень полезно, если бы кто-нибудь рассказал мне подробности, например, как здесь все будет работать. Заранее спасибо.